Property no initializer en TypeScript: cómo solucionarlo en 5 minutos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué TypeScript se queja de tus propiedades?



Estás escribiendo código en TypeScript, todo va genial... Y de repente — ¡pum! Una línea roja ondulada debajo de la propiedad de la clase, y el compilador muestra una frase escalofriante: Property '...' has no initializer and is not definitely assigned in the constructor. ¿Te suena? Si alguna vez has trabajado con Angular, React o simplemente con clases de TypeScript — probablemente sí.



Este error es uno de los más populares en Stack Overflow (miles de visitas, decenas de respuestas). Pero la buena noticia: no es grave. La mala noticia: si no lo entiendes, puedes meter la pata con errores en tiempo de ejecución. En este artículo analizaremos por qué ocurre este error de TypeScript, cómo solucionarlo y cuándo es apropiada cada solución.



¿Qué significa el error "Property has no initializer"?



Traduzcamos del lenguaje del compilador al humano. TypeScript te dice: "Oye, declaraste una propiedad en la clase, pero no le diste un valor inicial ni la asignaste en el constructor. No estoy seguro de que haya algo significativo ahí cuando accedas a esa propiedad".



Activa strict: true en tsconfig.json — y automáticamente activarás la bandera strictPropertyInitialization. Es precisamente esta la que se encarga de esta verificación. El código se ve más o menos así:



class User {  name: string; // ❌ ¡Error!  age: number;  // ❌ ¡Error!}


TypeScript señala con razón: name y age podrían ser undefined si olvidas inicializarlos. Y su tipo es estricto string y number, sin undefined. Ahí tienes el conflicto.



Método n.º 1: Inicialización directa en la declaración



La forma más simple y segura es darle un valor a la propiedad de inmediato. Esto es especialmente útil para campos con valores por defecto.



class User {  name: string = 'Invitado';  age: number = 0;  createdAt: Date = new Date();}


Cuándo usarlo: cuando el campo tiene un valor por defecto razonable. Por ejemplo, un contador, una bandera, una fecha de creación. Esta es la mejor práctica de TypeScript — indicas explícitamente el estado inicial.



Método n.º 2: Inicialización en el constructor



Un clásico. Si el valor debe venir de fuera — asígnalo en el constructor. TypeScript lo aprueba.



class User {  name: string;  age: number;

constructor(name: string, age: number) { this.name = name; this.age = age; }}


Importante: el compilador verificará que hayas asignado un valor a todas las propiedades. Si olvidas una — vuelve el error.



class User {  name: string;  age: number;

constructor(name: string) { this.name = name; // age no está asignado — ¡error! }}


Esto está hecho a propósito: TypeScript te protege de un undefined accidental. O inicializas todos los campos, o permites explícitamente que sean indefinidos.



Método n.º 3: Operador definite assignment (!)



A veces sabes con certeza que la propiedad se inicializará más tarde, pero no en el constructor. Por ejemplo, mediante inyección de dependencias en Angular o llamando a un método asíncrono. Entonces usa la definite assignment assertion — el signo de exclamación después del nombre de la propiedad.



class UserService {  user!: User; // OK, prometo que existirá

constructor() { this.initUser(); }

initUser() { this.user = new User('Alice', 30); }}


Atención: esta es una herramienta poderosa pero peligrosa. Le dices a TypeScript: "No revises, sé lo que hago". Si olvidas inicializar la propiedad — obtendrás undefined en tiempo de ejecución. Úsalo solo cuando estés 100% seguro.



Método n.º 4: Hacer la propiedad opcional (?)



Si

Blogs

Book Recommendations