Kita mungkin mendapatkan pesan Property has no initializer and is not definitely assigned in the constructorsaat menambahkan beberapa konfigurasi dalam tsconfig.jsonfile tersebut sehingga proyek Angular dapat dikompilasi dalam mode ketat:
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"alwaysStrict": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
Memang kompilator kemudian mengeluh bahwa variabel anggota tidak ditentukan sebelum digunakan.
Untuk contoh variabel anggota yang tidak ditentukan pada waktu kompilasi, variabel anggota memiliki @Inputarahan:
@Input() userId: string;
Kami dapat membungkam kompilator dengan menyatakan variabel mungkin opsional:
@Input() userId?: string;
Tapi kemudian, kita harus berurusan dengan kasus variabel yang tidak didefinisikan, dan mengacaukan kode sumber dengan beberapa pernyataan seperti itu:
if (this.userId) {
} else {
}
Sebaliknya, mengetahui nilai variabel anggota ini akan ditentukan dalam waktu, yaitu, akan ditentukan sebelum digunakan, kita dapat memberi tahu kompilator untuk tidak khawatir tentang hal itu tidak didefinisikan.
Cara untuk memberitahukannya ke kompilator adalah dengan menambahkan ! definite assignment assertionoperator, seperti di:
@Input() userId!: string;
Sekarang, kompilator memahami bahwa variabel ini, meskipun tidak didefinisikan pada waktu kompilasi, harus didefinisikan pada saat run-time, dan pada waktunya, sebelum digunakan.
Sekarang terserah aplikasi untuk memastikan variabel ini ditentukan sebelum digunakan.
Sebagai perlindungan tambahan, kita dapat menegaskan bahwa variabel sedang didefinisikan, sebelum kita menggunakannya.
Kita dapat menegaskan bahwa variabel telah ditentukan, yaitu, pengikatan input yang diperlukan sebenarnya disediakan oleh konteks panggilan:
private assertInputsProvided(): void {
if (!this.userId) {
throw (new Error("The required input [userId] was not provided"));
}
}
public ngOnInit(): void {
this.assertInputsProvided();
}
Mengetahui variabel telah ditentukan, variabel tersebut sekarang dapat digunakan:
ngOnChanges() {
this.userService.get(this.userId)
.subscribe(user => {
this.update(user.confirmedEmail);
});
}
Perhatikan bahwa ngOnInitmetode ini dipanggil setelah percobaan pengikatan input, ini, meskipun tidak ada masukan aktual yang diberikan ke pengikatan.
Sedangkan ngOnChangesmetode ini dipanggil setelah percobaan pengikatan masukan, dan hanya jika ada masukan aktual yang diberikan ke pengikatan.