I tipi di TypeScript descrivono che tipo di valore può contenere una variabile. Scrivi un tipo dopo i due punti, let name: string, e il compilatore rifiuta qualsiasi codice che ci metta un valore del tipo sbagliato. I tipi di base sono i sette primitivi di JavaScript più i tipi oggetto per array e oggetti.
Le annotazioni vengono controllate in compilazione e poi rimosse. Il programma che viene eseguito è JavaScript semplice.
I tipi primitivi
| Tipo | Valori di esempio | Note |
|---|---|---|
string | "hi", 'hi', `hi ${name}` | Testo. I tre stili di virgolette hanno lo stesso tipo. |
number | 42, 3.14, -0.5, NaN, Infinity | Qualsiasi numero, intero o no. Non esistono int o float. |
boolean | true, false | Solo questi due valori. |
bigint | 10n, BigInt(10) | Interi di qualsiasi dimensione. Richiede target ES2020 o successivo. |
symbol | Symbol("id") | Un valore unico, usato soprattutto come chiave di un oggetto. |
null | null | "Vuoto di proposito". |
undefined | undefined | "Non impostato". È anche ciò che si legge da una proprietà mancante. |
I nomi dei tipi sono minuscoli. typeof a runtime restituisce le stesse parole per la maggior parte di essi, quindi typeof x === "number" è il modo per controllare il tipo primitivo di un valore mentre il programma è in esecuzione.
Annotazioni di tipo
Un'annotazione è : Type dopo una variabile, un parametro o l'elenco dei parametri di una funzione. I parametri sono il punto in cui le annotazioni contano di più, perché TypeScript non può indovinare cosa passerà chi chiama.
Quando una variabile viene inizializzata sulla stessa riga, l'annotazione di solito è superflua: let count = 10 ha già il tipo number. Le regole per omettere i tipi sono nella pagina sull'inferenza dei tipi.
Un tipo sbagliato è un errore di compilazione
Assegna un valore del tipo sbagliato e il compilatore si ferma prima che venga eseguito qualsiasi cosa:
Il compilatore stampa:
index.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.
La soluzione è convertire il valore, port = Number("3000"), o cambiare l'annotazione se la variabile deve davvero contenere testo.
number: non esiste un tipo intero
JavaScript memorizza ogni numero come valore in virgola mobile a 64 bit, quindi TypeScript ha un solo tipo number. Gli interi sono esatti fino a Number.MAX_SAFE_INTEGER (2 ** 53 - 1). Oltre quel limite, usa bigint.
bigint e number non si mescolano: exact + 1 è un errore di compilazione (TS2365: Operator '+' cannot be applied to types 'bigint' and '1'., dove '1' è il tipo letterale di 1) e, se mai venisse eseguito, anche un TypeError a runtime. Converti esplicitamente uno dei due lati con BigInt(1) o Number(exact), sapendo che Number arrotonda i valori oltre l'intervallo sicuro.
Se vuoi un tipo che accetti solo numeri interi, TypeScript non può esprimerlo per valori arbitrari. Valida con Number.isInteger nel punto in cui il valore entra nel programma.
boolean
boolean ha esattamente due valori, true e false. I valori che sono solo truthy (1, "yes") non sono booleani, quindi trasformali in uno con Boolean(x) o x !== 0.
null e undefined
Con strict attivo (il predefinito da TypeScript 6.0), null e undefined sono tipi separati e non fanno parte di string, number o di qualsiasi altro tipo. Una variabile che può essere vuota lo dichiara con una union:
Leggere una proprietà di un valore che potrebbe essere undefined è un errore di compilazione finché non lo controlli. La pagina su null e undefined tratta i controlli, ?. e ??.
Array e oggetti in breve
Tutto ciò che non è un primitivo è un tipo oggetto. Le tre forme che incontri per prime:
let tags: string[] = ["ts", "js"]; // array of strings
let point: { x: number; y: number } = { x: 1, y: 2 }; // object with two number properties
let greet: (name: string) => string = (n) => `hi ${n}`; // function type
Ognuna ha la sua pagina: array, tuple (array a lunghezza fissa), tipi oggetto e tipi funzione.
string, number, boolean vs String, Number, Boolean
I nomi con la maiuscola sono i tipi degli oggetti wrapper di JavaScript (new String("x")), non dei valori normali. Annota con i nomi minuscoli.
index.ts(3,7): error TS2322: Type 'String' is not assignable to type 'string'.
'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.
Cambia String in string sulla prima riga e il blocco viene eseguito. Lo stesso vale per Number, Boolean, Symbol e BigInt. (Object è un caso a parte: accetta quasi qualsiasi valore, primitivi inclusi; vedi i tipi oggetto.)
Altri tipi predefiniti
Alcuni altri tipi compaiono presto. Ognuno ha la sua pagina.
| Tipo | Significato |
|---|---|
any | Disattiva i controlli per quel valore. Evitalo. |
unknown | Qualsiasi valore, ma devi controllarlo prima di usarlo. |
void | Una funzione non restituisce nulla di utile. |
never | Nessun valore: una funzione che lancia sempre un errore, o un caso impossibile. |
object | Qualsiasi valore non primitivo. |
"red" | "green" | Un tipo letterale: solo questi valori esatti. |
Domande frequenti
TypeScript ha un tipo intero?
No. number copre sia gli interi sia i decimali, perché JavaScript memorizza ogni numero come float a 64 bit. Controlla a runtime se un numero è intero con Number.isInteger(n), e usa bigint (10n) quando ti servono interi più grandi di Number.MAX_SAFE_INTEGER (2 ** 53 - 1) senza perdere precisione.
Che differenza c'è tra string e String in TypeScript?
string è il tipo primitivo, quello che hanno i letterali stringa e le template string. String è il tipo dell'oggetto wrapper creato da new String("x"). Annota sempre con i minuscoli string, number e boolean; assegnare una String a una string è un errore di compilazione (TS2322).
Quali sono i tipi primitivi in TypeScript?
Gli stessi sette di JavaScript: string, number, boolean, bigint, symbol, null e undefined. Tutto il resto (array, oggetti, funzioni, istanze di classi) è un tipo oggetto.
Come si dichiara una variabile con un tipo in TypeScript?
Metti i due punti e il tipo dopo il nome: let count: number = 0;. Per una funzione, annota ogni parametro e, se vuoi, il tipo di ritorno: function add(a: number, b: number): number. Quando una variabile viene inizializzata, di solito puoi omettere l'annotazione e lasciare che TypeScript la deduca.
I tipi di TypeScript esistono a runtime?
No. Il compilatore controlla i tipi e poi li rimuove, quindi il JavaScript che viene eseguito non ha annotazioni. A runtime controlli i valori con operatori JavaScript come typeof, Array.isArray e instanceof.