Entrambi i meccanismi, interface e type alias, permettono di descrivere strutture dati (oggetti, funzioni, tipi complessi).
Differenze:
|) 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:
interface.type.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 }
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.