Kita mungkin mendapatkan pesan Property has no initializer and is not definitely assigned in the constructor
saat menambahkan beberapa konfigurasi dalam tsconfig.json
file 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 @Input
arahan:
@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 assertion
operator, 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 ngOnInit
metode ini dipanggil setelah percobaan pengikatan input, ini, meskipun tidak ada masukan aktual yang diberikan ke pengikatan.
Sedangkan ngOnChanges
metode ini dipanggil setelah percobaan pengikatan masukan, dan hanya jika ada masukan aktual yang diberikan ke pengikatan.