ProgrammazioneSviluppatore Fullstack

Come implementare e tipizzare i costruttori sovraccarichi delle classi in TypeScript? Perché non è possibile semplicemente specificare più metodi constructor e come ottenere ciò in modo corretto?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • In una classe puoi specificare più firme sopra l'implementazione, ma è consentita SOLO UN'IMPLEMENTAZIONE del costruttore.
  • L'implementazione del costruttore deve essere compatibile con tutte le varianti di sovraccarico.
  • TypeScript verifica automaticamente la corrispondenza degli argomenti con i sovraccarichi.

Domanda ingannevole.

«È 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.