Entrambi descrivono la forma dei dati e spesso sono intercambiabili, ma hanno capacità diverse.
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
Entrambi descrivono la forma dei dati e spesso sono intercambiabili, ma hanno capacità diverse.
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
Ciò che type può fare che interface non può
type ID = string | number; // unions
type Pair = [number, number]; // tuples
type Name = User["name"]; // indexed/mapped/conditional types
type Nullable<T> = T | null; // wrap any type
type è un alias generale per qualsiasi tipo — primitives, unions, tuples, mapped types. interface descrive solo le forme di object/function.
interface può fare che type non puòinterface Box { width: number; }
interface Box { height: number; } // declaration merging — both merge into one
// Box now has width AND height
Le interfacce supportano il declaration merging (dichiarazioni multiple si combinano) e sono il modo idiomatico per estendere/aumentare, incluso l'aumento dei tipi di librerie di terze parti.
interface Admin extends User { role: string; } // interface
type Admin2 = User & { role: string }; // type uses intersection
Una convenzione comune: usa interface per le forme di object e le API pubbliche (messaggi di errore migliori, estensibili, fusibili) e type quando hai bisogno di unions, tuples o altre operazioni di tipo. Scegli uno come impostazione predefinita per coerenza — molti team utilizzano interface per impostazione predefinita per gli object e ricorrono a type solo quando è necessaria la sua potenza aggiuntiva.