Un type alias dà un nome a un tipo. Scrivi type Name = ... e da quel momento Name si può usare ovunque sia atteso un tipo. A differenza di un'interface, un alias può dare un nome a qualsiasi tipo, non solo alle forme degli oggetti.
Gli alias esistono solo in fase di compilazione. Il JavaScript generato non contiene nessuna di queste righe type.
Sintassi
type Name = SomeType;
type Name<T> = SomeTypeUsing<T>; // generic
export type Name = SomeType; // exported from a module
Per convenzione i nomi sono in PascalCase. Il lato destro è una qualsiasi espressione di tipo, e un alias può usare altri alias, compreso se stesso (vedi i tipi ricorsivi più avanti). L'alias è disponibile in tutto lo scope in cui è dichiarato, anche sopra la riga della dichiarazione, perché i tipi vengono controllati in fase di compilazione e non eseguiti in ordine come const o let.
Tipi oggetto
Per la forma di un oggetto, un alias e un'interface si scrivono quasi allo stesso modo. L'alias usa = e di solito termina con un punto e virgola.
Un alias non può usare extends; quel ruolo lo svolge l'intersezione &. I controlli sulle proprietà in eccesso e le proprietà opzionali e readonly funzionano esattamente come nelle interface. Quale dei due scegliere per le forme degli oggetti è spiegato nella pagina interface vs type.
Union, tuple e funzioni
Questi sono i casi a cui solo un alias può dare un nome, e il motivo principale per cui type esiste. Un alias di union elenca le alternative, un alias di tuple fissa la lunghezza e i tipi degli elementi di un array, e un alias di funzione descrive una firma.
In scale i parametri non hanno bisogno di annotazioni: i loro tipi li fornisce l'alias Transform. La sintassi delle tuple è spiegata in tuple, e il restringimento delle union nella pagina sugli union types.
Type alias generici
I parametri di tipo fanno funzionare un solo alias con molti tipi. Possono avere valori predefiniti, proprio come i parametri delle funzioni.
Result<number> usa il valore predefinito E = string. Piccoli alias generici come type Nullable<T> = T | null o type Dict<T> = Record<string, T> sono comuni nel codice reale. Anche gli utility type integrati (Partial<T>, Pick<T, K>, ReturnType<F>) sono alias generici, dichiarati nella libreria standard.
Gli alias sono nomi, non tipi nuovi
Un alias non crea un tipo distinto. È un secondo nome per il tipo a destra, e il compilatore tratta i due come identici. Due alias di string sono del tutto intercambiabili:
Questo stampa cancelling u_42 senza alcun errore, ed è proprio il bug che un alias non può impedire. L'alias aiuta comunque chi legge (un parametro tipizzato OrderId dice più di string), ma se confondere due id deve essere un errore di compilazione, usa un branded type come string & { readonly __brand: "OrderId" }.
Type alias ricorsivi
Un alias può riferirsi a se stesso, ed è così che descrivi alberi, liste annidate e JSON:
L'alias Json rifiuta i valori che JSON non può rappresentare: { when: new Date() } o { f: undefined } assegnati a Json sono errori di compilazione (TS2322).
Tipi dai valori: typeof
Quando un valore esiste già, puoi dare un nome al suo tipo invece di scriverlo per intero. L'operatore di tipo typeof legge il tipo di una variabile e si combina con altri operatori:
const defaults = { retries: 3, verbose: false, level: "info" };
type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }
type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"
function start(port: number) {
return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }
Il valore resta l'unica fonte di verità: aggiungi una proprietà a defaults e Options si adegua. Approfondisci in typeof.
Esportare e importare gli alias
Gli alias si esportano e si importano come i valori. import type rende esplicito che viene importato solo un tipo, quindi l'import viene sempre rimosso dall'output JavaScript:
// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };
// main.ts
import type { Point, Shape } from "./shapes.js";
const p: Point = { x: 1, y: 2 };
Domande frequenti
Cos'è un type alias in TypeScript?
Un type alias è un nome per un tipo, dichiarato con la parola chiave type: type Point = { x: number; y: number }. Da quel momento Point si può usare ovunque sia atteso un tipo. Può dare un nome a qualsiasi tipo: la forma di un oggetto, una union, una tuple, la firma di una funzione, un primitivo o un tipo generico.
Un type alias crea un tipo nuovo?
No. Un alias è solo un altro nome per un tipo esistente. Con type UserId = string e type OrderId = string, un UserId si può passare dove è atteso un OrderId, perché entrambi sono semplicemente string. Per creare tipi non intercambiabili, usa un branded type.
Un type alias può riferirsi a se stesso?
Sì, purché il riferimento a se stesso sia annidato dentro un tipo oggetto, un array o una tuple: type TreeNode = { value: number; children: TreeNode[] } e un alias Json che include Json[] funzionano entrambi. Un riferimento diretto come type Loop = Loop | string è l'errore TS2456, Type alias 'Loop' circularly references itself.
Un type alias può essere generico?
Sì. Metti i parametri di tipo dopo il nome: type Box<T> = { value: T }, poi usalo come Box<number>. I parametri possono avere valori predefiniti (type Result<T, E = string> = ...) e vincoli (type Keys<T extends object> = keyof T).
Come ottengo un tipo da un oggetto esistente?
Usa l'operatore di tipo typeof: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; dà { retries: number; verbose: boolean }. Così hai un'unica fonte di verità quando il valore viene prima del tipo.