angular - Modul strict - incompatibilitate de tip la setarea valorii pentru ngComponentOutlet cu componentă încărcată lazy
Încerc să încarc un componentă pe cerere în Angular 11 (mod strict) urmând acest ghid. Modul strict a fost o provocare pentru că aproape niciun exemplu/tutorial nu îl folosește.
Acest component va încărca componenta de antet corespunzătoare (în cele din urmă). Încerc doar să încarc pe modul lazy unul pentru „site-ul A” pentru început.
header-loader-component.ts
@Component({
selector: 'header-loader',
template: `<ng-template [ngComponentOutlet]="headerComponent | async"></ng-template>`,
styles: []
})
export class HeaderLoaderComponent implements OnInit {
headerComponent: Promise<Type<SiteAHeaderComponent>>;
constructor() { }
ngOnInit(): void {
this.LoadHeaderComponent();
}
private LoadHeaderComponent() {
if (!this.headerComponent) {
this.headerComponent = import(`../myFolder/siteA-header/siteA-header.component`)
.then(({ SiteAHeaderComponent}) => SiteAHeaderComponent);
}
}
}
Cu asta, primesc eroare:
Proprietatea 'headerComponent' nu are un initializer și nu este alocată cu certitudine în constructor.
Ok, m-am obișnuit cu acea eroare până acum cu modul strict, așa că o schimb în:
headerComponent: Promise<Type<SiteAHeaderComponent>> | null = null;
astfel încât să poată începe ca null înainte ca ngOnInit să aibă șansa să îl seteze.
Acum, pe [ngComponentOutlet] primesc:
Tipul 'Type | null' nu poate fi atribuit tipului 'Type'
Cum pot seta o valoare pentru headerComponent?
Editare:
Doar ca să fiu sigur, am încercat asta cu Strict dezactivat temporar și funcționează grozav.
Răspuns #1
Folosește simbolul ! cu proprietatea atunci când o atribui, ca în headerComponent!.
Simbolul ! cu numele proprietății înseamnă că declarați în mod explicit - „Știu că această proprietate are o valoare nenulă”. Și în cazul tău, dacă are o valoare nenulă, atunci valoarea pe care o are este cu siguranță de tipul Type.
EDITARE :
Deoarece proprietatea headerComponent este de tip Promise, trebuie să folosești simbolul ! în jurul pipe-ului async în template, ca în (headerComponent|async)!.
De asemenea, aș recomanda să folosești -
headerComponent: Promise<Type<any>> | null = null;
Altfel, nu vei putea seta mai târziu un tip diferit de componentă header prin proprietatea headerComponent.
