ProgramaciónDesarrollador Fullstack

¿Cómo implementar y tipificar constructores sobrecargados en TypeScript? ¿Por qué no se pueden declarar varios métodos constructor, y cómo lograrlo correctamente?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

TypeScript no admite múltiples declaraciones de cuerpo del constructor en una misma clase, como es posible en muchos lenguajes OOP. En su lugar, se pueden declarar varias firmas de constructor (sobrecargas), y luego implementar un único cuerpo de constructor, donde se realiza manualmente el análisis de los argumentos:

class User { name: string; age: number; constructor(name: string); constructor(name: string, age: number); constructor(name: string, age?: number) { this.name = name; this.age = age ?? 18; } } const u1 = new User('Alice'); // age = 18 const u2 = new User('Bob', 32); // age = 32

Detalles importantes:

  • En la clase se pueden especificar múltiples firmas por encima de la implementación, pero solo se permite UNA implementación del constructor.
  • La implementación del constructor debe ser compatible con todas las variantes de sobrecarga.
  • TypeScript verifica automáticamente la correspondencia de los argumentos con las sobrecargas.

Pregunta capciosa.

"¿Se puede implementar el constructor así?"

undefined

class Test { constructor(x: number) {} constructor(x: string) {} }


**Respuesta correcta:** No, dicho código generará un error: "Duplicate constructor implementation". En TypeScript, solo se permite una implementación del cuerpo del constructor, las sobrecargas se definen con firmas (sin cuerpo).

### Ejemplos de errores reales debido al desconocimiento de los matices del tema.

---
> Historia

En el proyecto intentaron implementar una clase con dos constructores con diferentes parámetros, copiando la experiencia de Java. Como resultado, TypeScript arrojaba un error de compilación, el proyecto no se compilaba, y tuvieron que rehacerlo rápidamente para ajustarse a las sobrecargas en las firmas.

---
> Historia

Uno de los miembros del equipo escribió el constructor de la clase con sobrecarga, pero olvidó tener en cuenta la opcionalidad de los parámetros (no trató undefined). Esto provocaba intentos de acceder a valores inexistentes y fallos al crear instancias con el conjunto mínimo de argumentos.

---
> Historia

Se declararon sobrecargas del constructor, pero el cuerpo del constructor no coincidía con las variantes de llamada descritas. En un caso se esperaba obligatoriamente un segundo argumento, mientras que en la firma era opcional. Este conflicto no se detectó de inmediato, pero surgió al escribir pruebas unitarias y dificultó la depuración.