TypeScript non supporta più dichiarazioni del corpo del costruttore in una singola classe, come è possibile in molti linguaggi OOP. Invece, puoi dichiarare più firme del costruttore (overloads) e poi implementare un unico corpo del costruttore, dove si effettua manualmente lo parsing degli argomenti:
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
Dettagli importanti:
«È possibile implementare il costruttore in questo modo?»
undefined
class Test { constructor(x: number) {} constructor(x: string) {} }
**Risposta corretta:** No, questo codice genererà un errore: "Duplicate constructor implementation". In TypeScript è consentita solo un'implementazione del corpo del costruttore, i sovraccarichi sono espressi come firme (senza corpo).
### Esempi di errori reali a causa della mancata conoscenza delle sottigliezze della materia.
---
> Storia
Nel progetto si è tentato di implementare una classe con due costruttori con parametri diversi copiando l'esperienza da Java. Di conseguenza, TypeScript ha generato un errore di compilazione, il progetto non si compilava, è stato necessario rifare rapidamente per i sovraccarichi nelle firme.
---
> Storia
Uno dei membri del team ha scritto un costruttore di classe con sovraccarico, ma ha dimenticato di considerare l'opzionalità dei parametri (non gestiva undefined). Questo portava a tentativi di accesso a valori inesistenti e a crash nella creazione di istanze con il minimo set di argomenti.
---
> Storia
Erano state dichiarate delle sovraccarichi del costruttore, ma il corpo del costruttore non corrispondeva alle varianti di chiamata descritte. In un caso era previsto obbligatoriamente un secondo argomento, mentre nella firma era opzionale. Questo conflitto non è stato rilevato subito, ma è emerso durante la scrittura di test unitari e ha complicato il debugging.