Saltar al contenido

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS2564

    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

    1. 01
      class C {
        x = 0
      }

      Inicialízala en línea. El tipo se infiere del valor, así que no hay nada que mantener sincronizado.

    2. 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.

    Errores