ProgrammazioneSviluppatore Fullstack

Parlami delle interfacce (interface) e degli alias di tipo (type alias) in TypeScript. Qual è la differenza e quando scegliere l'uno o l'altro approccio?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Entrambi i meccanismi, interface e type alias, permettono di descrivere strutture dati (oggetti, funzioni, tipi complessi).

  • Interface — dichiarazione classica di un'interfaccia. Permette di estendere le interfacce, unire (declaration merging), ereditare facilmente.
  • Type alias — crea un nuovo alias di tipo. Può essere combinato con union / intersection, assegnato a qualsiasi entità: primitivi, funzioni, tuple, ecc.

Differenze:

  • Estensibilità: l'interface è migliore per strutture oggettuali, supporta unione dichiarativa.
  • Flessibilità: il type alias è universale, adatto a tutto: unioni (|) e intersezioni (&).

Esempio:

interface Animal { name: string } interface Dog extends Animal { bark(): void } // type alias per unione di tipi: type MyType = string | number type Cat = Animal & { purr(): void }

Consigliato:

  • Per API pubbliche — usare interface.
  • Per unioni complesse e alias — usare type.

Domanda insidiosa.

Domanda: È possibile aggiungere un nuovo campo a un tipo definito attraverso type alias in un altro file?

Risposta:

No. Il type alias non può essere esteso dichiarativamente da un altro file, a differenza dell'interface.

Esempio:

// main.ts type User = { name: string } // another.ts type User = { age: number } // Errore: Duplicate identifier // interface: // main.ts interface User { name: string } // another.ts interface User { age: number } // Ok, User = { name: string, age: number }

Esempi di errori reali dovuti alla mancanza di conoscenza delle sfumature dell'argomento.


Storia

In un grande progetto definivano strutture dati comuni tramite type alias. Quando era necessario aggiungere un campo a un tipo esistente da un altro pacchetto, si è scoperto che il type alias non supporta il declaration merging — è stato necessario riscrivere come interface, causando ritardi.


Storia

Uno degli sviluppatori ha descritto funzioni tramite interface, e poi ha cercato di aggiungere un tipo Union (stringa o funzione) — si è scoperto che l'interface non è adatta per questo, e sono stati costretti a cambiare tutte le definizioni in type alias con intersection/union.


Storia

Dopo il cambio di tipo da interface a type alias, hanno confuso la sintassi di estensione: hanno cercato di usare extends, invece di unire tramite &. L'errore è emerso tardi e non hanno capito immediatamente la causa.