Es posible que recibamos el mensaje Property has no initializer and is not definitely assigned in the constructoral agregar alguna configuración en el tsconfig.jsonarchivo para tener un proyecto Angular compilado en modo estricto:
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"alwaysStrict": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
De hecho, el compilador luego se queja de que una variable miembro no está definida antes de ser utilizada.
Para un ejemplo de una variable miembro que no está definida en tiempo de compilación, una variable miembro que tiene una @Inputdirectiva:
@Input() userId: string;
Podríamos silenciar el compilador indicando que la variable puede ser opcional:
@Input() userId?: string;
Pero entonces, tendríamos que lidiar con el caso de que la variable no esté definida y saturar el código fuente con algunas de estas declaraciones:
if (this.userId) {
} else {
}
En cambio, conociendo el valor de esta variable miembro se definiría en el tiempo, es decir, se definiría antes de ser utilizada, podemos decirle al compilador que no se preocupe por no estar definida.
La forma de decirle esto al compilador es agregar el ! definite assignment assertionoperador, como en:
@Input() userId!: string;
Ahora, el compilador entiende que esta variable, aunque no está definida en tiempo de compilación, se definirá en tiempo de ejecución y en el tiempo, antes de que se utilice.
Ahora depende de la aplicación asegurarse de que esta variable esté definida antes de ser utilizada.
Como protección adicional, podemos afirmar que la variable se está definiendo, antes de usarla.
Podemos afirmar que la variable está definida, es decir, el contexto de llamada proporcionó el enlace de entrada requerido:
private assertInputsProvided(): void {
if (!this.userId) {
throw (new Error("The required input [userId] was not provided"));
}
}
public ngOnInit(): void {
this.assertInputsProvided();
}
Sabiendo que se definió la variable, la variable ahora se puede usar:
ngOnChanges() {
this.userService.get(this.userId)
.subscribe(user => {
this.update(user.confirmedEmail);
});
}
Tenga en cuenta que el ngOnInitmétodo se llama después del intento de vinculación de entrada, esto, incluso si no se proporcionó una entrada real a las vinculaciones.
Mientras que el ngOnChangesmétodo se llama después del intento de vinculación de entrada, y solo si se proporcionó una entrada real a las vinculaciones.