ProgrammazioneSviluppatore Fullstack

Come funziona l'estensione dei tipi (extends), quali sono le sfumature nell'uso con i tipi e le interfacce, e come influisce sulla struttura del tuo progetto?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In TypeScript è possibile estendere (heritare) i tipi sia con interface extends, sia con type & type (intersection types). Anche le interfacce possono estendere i tipi e viceversa.

Interfacce utilizzano la parola chiave extends per ereditare le proprietà:

interface Animal { name: string; } interface Bird extends Animal { wings: number; }

Tipi possono essere uniti tramite &:

type Animal = { name: string }; type Bird = Animal & { wings: number };

Inoltre, un'interfaccia può estendere un altro tipo:

type Base = { id: number }; interface Derived extends Base { description: string; }

Caratteristiche:

  • Le interfacce supportano il merging dichiarativo (declaration merging), i tipi no.
  • Le interfacce sono consigliate se ci si aspetta di estendere altre entità (ad esempio, per le librerie).
  • Gli extends annidati possono causare gerarchie complesse, rendendo difficile il supporto e creando conflitti di nomi.

Domanda insidiosa

È possibile estendere un tipo (type) tramite un'interfaccia o viceversa? Qual è l'errore commesso dalla maggior parte?

Molti credono che sia possibile estendere solo interfacce tramite interfacce, ma in realtà un'interfaccia può estendere un tipo:

type Basic = { flag: boolean }; interface Extra extends Basic { name: string; }

Ma un tipo non può estendere altri tipi tramite extends — solo tramite intersezione di tipi (&).

Esempi di errori reali dovuti alla mancanza di conoscenza delle sfumature del tema


Storia

In un grande progetto si univano le interfacce tramite extends, dimenticando che le proprietà con lo stesso nome devono corrispondere per tipo. Quando qualcuno ha modificato il tipo di una proprietà nell'interfaccia padre, si sono verificati conflitti silenziosi nelle interfacce figlie e il database ha smesso di corrispondere all'API.

Storia

Nella libreria sono stati scritti alias di tipo con sovrapposizioni di proprietà tramite & (intersezioni), ma alcune proprietà sono state rese incompatibili per tipo. TypeScript ha ignorato questo durante la compilazione, ma in fase di runtime si sono verificate anomalie nei campi.

Storia

Il team riteneva che un'interfaccia non potesse essere estesa tramite un tipo, e per estendere la funzionalità comune riscrivevano tutte le strutture da type a interface, sprecando molto tempo e sforzi — mentre sarebbe stato possibile semplicemente estendere i tipi esistenti in modo non standard.