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:
"¿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.