Propiedad nunca asignada
Property 'x' has no initializer and is not definitely assigned in the constructor.Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.
La clase declara una propiedad a la que nunca se le da un valor, así que cada instancia empezaría con `undefined` en un hueco que el tipo dice que siempre es un número.
Reproducción
class C {
x: number
}La compilación afirma que esto emite exactamente este código.
Por qué lo dice el compilador
Esto viene de `strictPropertyInitialization`, y cierra un agujero que existió durante años: a una propiedad declarada se le creía bajo palabra. El compilador aceptará un inicializador, una asignación segura en el constructor, o admitir que la propiedad es opcional — lo que no aceptará es un tipo que promete más de lo que la clase puede entregar.
Arreglos
- 01
class C { x = 0 }Inicialízala en línea. El tipo se infiere del valor, así que no hay nada que mantener sincronizado.
- 02
class C { x: number constructor(x: number) { this.x = x } }O asígnala en el constructor, donde el compilador puede ver que todas las rutas llegan a ella.
Conclusión
El modificador de asignación segura `!` también silencia esto, y es una promesa que el compilador no puede comprobar. Recurre a él solo cuando algo fuera de la clase hace realmente la asignación.