Bir Angular projesinin katı modda derlenmesi Property has no initializer and is not definitely assigned in the constructoriçin tsconfig.jsondosyaya bazı konfigürasyonlar eklerken mesajı alabiliriz :
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"alwaysStrict": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
Aslında derleyici daha sonra bir üye değişkenin kullanılmadan önce tanımlanmadığından şikayet eder.
Derleme zamanında tanımlanmamış bir üye değişken örneği için, bir @Inputdirektif içeren bir üye değişkeni :
@Input() userId: string;
Değişkenin isteğe bağlı olabileceğini belirterek derleyiciyi susturabiliriz:
@Input() userId?: string;
Ama sonra, değişkenin tanımlanmamış olması durumuyla ilgilenmemiz ve kaynak kodunu bu tür ifadelerle karıştırmamız gerekir:
if (this.userId) {
} else {
}
Bunun yerine, bu üye değişkenin değerini bilmek zamanında tanımlanacaktır, yani kullanılmadan önce tanımlanacaktır, derleyiciye tanımlanmaması konusunda endişelenmemesini söyleyebiliriz.
Bunu derleyiciye söylemenin yolu ! definite assignment assertion, aşağıdaki gibi operatörü eklemektir :
@Input() userId!: string;
Şimdi, derleyici bu değişkenin, derleme zamanında tanımlanmamış olmasına rağmen, çalışma zamanında ve kullanılmadan önce zamanında tanımlanması gerektiğini anlar.
Bu değişkenin kullanılmadan önce tanımlanmasını sağlamak artık uygulamaya bağlıdır.
Ek bir koruma olarak, kullanmadan önce değişkenin tanımlandığını söyleyebiliriz.
Değişkenin tanımlandığını, yani gerekli girdi bağlamanın aslında çağıran bağlam tarafından sağlandığını iddia edebiliriz:
private assertInputsProvided(): void {
if (!this.userId) {
throw (new Error("The required input [userId] was not provided"));
}
}
public ngOnInit(): void {
this.assertInputsProvided();
}
Değişkenin tanımlandığını bilerek, değişken artık kullanılabilir:
ngOnChanges() {
this.userService.get(this.userId)
.subscribe(user => {
this.update(user.confirmedEmail);
});
}
ngOnInitYöntemin giriş bağlama girişiminden sonra çağrıldığına dikkat edin , bu, bağlamalara hiçbir gerçek girdi sağlanmasa bile.
Oysa ngOnChangesyöntemi giriş bağlantıları çalışıldıktan sonra denir ve sadece bağları sağlanan gerçek giriş orada edilir.