Quando scriviamo codice TypeScript, possiamo indicare esplicitamente il tipo dei valori oppure lasciare che sia TypeScript a dedurlo automaticamente.
Questi due meccanismi sono chiamati Type Annotation e Type Inference.
In questa lezione, vediamo la differenza tra i due e come scrivere codice tipizzato senza aggiungere informazioni non necessarie.
La Type Inference, in italiano inferenza di tipo, è il meccanismo attraverso cui TypeScript determina automaticamente il tipo di una variabile osservando il valore che le viene assegnato.
Per esempio:
let nome = "Andrea";Non abbiamo specificato il tipo di nome, ma TypeScript può dedurlo dal valore. Di conseguenza, TypeScript sa che nome è una stringa e può controllare il modo in cui viene utilizzata.
Per esempio:
let nome = "Andrea";
nome = "Anna";Questo esempio è valido, mentre quest'altro esempio genera un errore:
let nome = "Andrea";
nome = 10;L'esempio genera un errore perché stiamo cercando di assegnare un number a una variabile che TypeScript ha identificato come string.
L'inferenza permette quindi di ottenere i vantaggi della tipizzazione anche senza specificare esplicitamente il tipo.
La Type Annotation è invece l'indicazione esplicita del tipo di una variabile.
La sintassi è: variabile: tipo. Ad esempio:
let nome: string = "Andrea";In questo caso abbiamo specificato esplicitamente che nome deve contenere una string.
Possiamo fare la stessa cosa con altri tipi primitivi:
let eta: number = 30;
let maggiorenne: boolean = true;Nella maggior parte dei casi semplici, l'inferenza di tipo è sufficiente.
In questo esempio, TypeScript può dedurre autonomamente che si tratta di una stringa, un numero e di un valore booleano:
const nome = "Andrea";
const eta = 30;
const attivo = true;Utilizzare l'inferenza quando è evidente rende spesso il codice più breve e leggibile.
Inoltre, l'inferenza non si limita ai valori letterali. TypeScript può dedurre il tipo anche dal risultato di un'espressione, ad esempio:
const prezzo = 50;
const iva = 10;
const totale = prezzo + iva;Nell'esempio, TypeScript determina autonomamente che anche totale è di tipo number.
TypeScript può dedurre anche il tipo restituito da una funzione, per esempio:
function somma(a: number, b: number) {
return a + b;
}TypeScript può dedurre dal return che a + b è di tipo number.
La tipizzazione esplicita diventa particolarmente utile quando il tipo non può essere dedotto dal valore iniziale oppure quando vogliamo stabilire in anticipo quali valori una variabile può contenere.
Un caso particolarmente importante è rappresentato dai parametri delle funzioni. Ad esempio, consideriamo:
function saluta(nome: string) {
console.log(`Ciao ${nome}`);
}Nell'esempio, abbiamo specificato che nome deve essere una stringa. Quindi posso utilizzare soltanto parametri di tipo string:
saluta("Andrea"); // "Ciao Andrea"
saluta(10); // ErrorePossiamo utilizzare una Type Annotation anche per indicare il tipo restituito da una funzione, specificandolo prima delle parentesi graffe:
function somma(a: number, b: number): number {
return a + b;
}In questo caso abbiamo indicato che la funzione restituisce un number.
Anche se TypeScript sarebbe in grado di dedurre questo tipo, una Type Annotation esplicita può essere utile quando vogliamo rendere particolarmente chiaro il compito della funzione o controllare che restituisca sempre il tipo previsto.