TypeScript supporta l'operatore typeof non solo a tempo di esecuzione (come in JavaScript), ma anche durante la compilazione per inferire il tipo di un'espressione. Questo consente di ottenere il tipo di una variabile già dichiarata, di una funzione o di una struttura oggetto, rendendo la tipizzazione flessibile e riducendo la probabilità di duplicazione e disallineamento dei tipi.
Inizialmente in JavaScript, l'operatore typeof veniva utilizzato per determinare il tipo di un valore a runtime. TypeScript ha ampliato questo meccanismo: ora typeof in fase di compilazione crea un riferimento al tipo del valore di una variabile o al risultato di una funzione. Questo è estremamente utile quando si lavora con strutture complesse, configurazioni e per il riutilizzo dei tipi tra moduli.
Quando si dichiara manualmente un tipo, è facile commettere errori: cambiare la definizione di una struttura e dimenticare di aggiornare la dichiarazione di tipo o interfaccia, o copiare in modo errato i tipi tra oggetti. Ciò porta a disallineamenti nel codice e a errori di esecuzione. Utilizzando typeof, il tipo viene inferito in modo dinamico e corrisponde sempre alla struttura attuale dei dati.
Per dichiarare una variabile con un tipo che corrisponde già a una struttura esistente o a una costante, si utilizza l'operatore typeof:
const config = { host: "localhost", port: 8080, }; let serverCfg: typeof config; // Il tipo di serverCfg è lo stesso di config
Per tipizzare una funzione che restituisce una certa struttura:
function makeUser() { return { id: 1, name: "Alex" }; } type User = ReturnType<typeof makeUser>; // User: {id: number; name: string;}
Caratteristiche chiave:
typeof in TS restituisce il tipo del valore di una variabile o del risultato di un'espressione a compile time.ReturnType, Parameters), e anche con keyof per ottenere l'elenco delle chiavi di un oggetto.L'operatore typeof viene eseguito in TypeScript a tempo di esecuzione?
No, il typeof di tipo funziona solo durante la compilazione, non entra nel codice runtime, anche se l'operatore typeof di JavaScript esiste anche a runtime.
Può typeof essere utilizzato per inferire il tipo delle proprietà di una classe?
Sì, ma solo se la proprietà è già dichiarata come statica o con un valore iniziale, altrimenti si verificherà un errore. Per private/public protected si considerano solo le proprietà/metodi pubblici.
C'è differenza tra 'let x: typeof y;' e 'let x = y;'?
Dal punto di vista del tipo, in entrambi i casi il compilatore inferirà automaticamente il tipo. Tuttavia, 'typeof' può essere utilizzato per scrivere dichiarazioni di tipo senza inizializzazione o per combinazioni più complesse con tipi utilitari.
typeof per il solito controllo di tipo js typeof x === 'string' — questo è a runtime, non un tipo compilabile.Nel progetto viene descritto un grande oggetto di configurazione dell'app separatamente come tipo, separatamente come variabile. Quando si modifica la struttura, si dimentica di aggiornare il tipo, il che porta a errori nel funzionamento dell'API.
Pro: Lavoro flessibile con i tipi, si possono ridefinire i tipi tramite type o interface.
Contro: Grande rischio di disallineamento tra struttura e tipi, scarsa manutenzione.
Utilizzare typeof per ottenere il tipo attuale di una struttura oggetto durante la dichiarazione di nuove variabili e durante la generazione del tipo per l'interfaccia API.
Pro: Il tipo corrisponde sempre al valore, bassa probabilità di errore, buona autocompletazione.
Contro: Se l'oggetto è molto complesso, il tipo finale potrebbe risultare difficile da leggere per i principianti.