Möglicherweise wird die folgende Meldung angezeigt, Property has no initializer and is not definitely assigned in the constructorwenn der tsconfig.jsonDatei eine Konfiguration hinzugefügt wird , damit ein Angular-Projekt im strengen Modus kompiliert wird:
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"alwaysStrict": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
In der Tat beschwert sich der Compiler dann darüber, dass eine Mitgliedsvariable vor ihrer Verwendung nicht definiert wurde.
Für ein Beispiel einer Mitgliedsvariablen, die zur Kompilierungszeit nicht definiert ist, eine Mitgliedsvariable mit einer @InputDirektive:
@Input() userId: string;
Wir könnten den Compiler zum Schweigen bringen, indem wir angeben, dass die Variable optional sein kann:
@Input() userId?: string;
Aber dann müssten wir uns mit dem Fall befassen, dass die Variable nicht definiert wird, und den Quellcode mit einigen solchen Anweisungen überladen:
if (this.userId) {
} else {
}
Wenn wir wissen, dass der Wert dieser Mitgliedsvariablen zeitlich definiert wird, dh vor der Verwendung definiert wird, können wir dem Compiler mitteilen, dass er sich keine Sorgen machen soll, dass er nicht definiert wird.
Die Möglichkeit, dies dem Compiler mitzuteilen, besteht darin, den ! definite assignment assertionOperator wie folgt hinzuzufügen :
@Input() userId!: string;
Jetzt versteht der Compiler, dass diese Variable, obwohl sie zur Kompilierungszeit nicht definiert ist, zur Laufzeit und rechtzeitig definiert werden soll, bevor sie verwendet wird.
Es ist nun Sache der Anwendung, sicherzustellen, dass diese Variable definiert ist, bevor sie verwendet wird.
Als zusätzlichen Schutz können wir behaupten, dass die Variable definiert wird, bevor wir sie verwenden.
Wir können behaupten, dass die Variable definiert ist, dh die erforderliche Eingabebindung wurde tatsächlich vom aufrufenden Kontext bereitgestellt:
private assertInputsProvided(): void {
if (!this.userId) {
throw (new Error("The required input [userId] was not provided"));
}
}
public ngOnInit(): void {
this.assertInputsProvided();
}
Da die Variable definiert wurde, kann sie jetzt verwendet werden:
ngOnChanges() {
this.userService.get(this.userId)
.subscribe(user => {
this.update(user.confirmedEmail);
});
}
Beachten Sie, dass die ngOnInitMethode nach dem Versuch der Eingabebindungen aufgerufen wird, auch wenn für die Bindungen keine tatsächliche Eingabe bereitgestellt wurde.
Während die ngOnChangesMethode nach dem Versuch der Eingabebindungen aufgerufen wird, und nur, wenn tatsächlich eine Eingabe für die Bindungen bereitgestellt wurde.