Storia della questione:
TypeScript implementa la tipizzazione statica, quindi a volte è necessario convertire esplicitamente un tipo in un altro. Ad esempio, quando uno sviluppatore conosce meglio la struttura dei dati rispetto al compilatore o quando si deve lavorare con un'API tipizzata, i cui tipi di origine non corrispondono a quelli attesi. A tal fine si utilizza il meccanismo del type casting, o assert di tipo.
Problema:
Il type casting in TypeScript non esegue alcuna conversione di valori a livello di esecuzione: informa solo il compilatore di "fidati di me". Questo può portare a errori se il cast specificato non corrisponde al reale contenuto dei dati. Gli errori appariranno solo a runtime e non saranno rilevati dal compilatore.
Soluzione:
In TypeScript sono incluse due sintassi per il type casting: la sintassi delle parentesi angolari (obsoleta, non raccomandata per JSX) e la sintassi as (raccomandata).
Esempio di codice:
// Sintassi con parentesi angolari (non per .tsx) let someValue: any = "Hello World"; let strLength: number = (<string>someValue).length; // Sintassi con as let strLength2: number = (someValue as string).length; // Type casting di un oggetto (non sicuro!) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // è possibile, ma bypassa la tipizzazione!
Caratteristiche chiave:
Il type assertion esegue trasformazioni automatiche dei valori a runtime, come in C# o Java?
No, il type assertion indica solo al compilatore che la variabile è di quel tipo. Nessuna trasformazione dei valori avviene — la responsabilità ricade completamente sullo sviluppatore.
È possibile convertire il tipo A in B senza una struttura comune?
TypeScript permetterà di farlo (attraverso cast doppi, ad esempio any o unknown), ma questo mina la sicurezza dei tipi e può portare a errori durante l'esecuzione.
const a = 5 as unknown as string; // non sicuro!
È sicuro convertire any in un tipo complesso?
No, any disabilita il controllo dei tipi: la conversione di any in un altro tipo è possibile, ma TypeScript non sarà in grado di rilevare le incongruenze, eventuali errori si manifesteranno solo durante l'esecuzione.
Uno sviluppatore riceve un oggetto da un server senza controllare la struttura, lo converte nel tipo atteso semplicemente usando as SomeType e lo utilizza nella logica aziendale. Se l'API cambia o c'è un bug sul server, l'applicazione si interrompe a runtime, senza errori durante il processo di costruzione.
Vantaggi:
Svantaggi:
Lo sviluppatore valida preliminarmente la struttura dell'oggetto ricevuto, utilizza una funzione di tipo guard personalizzata e solo dopo un controllo riuscito avviene l'asserzione di tipo.
Vantaggi:
Svantaggi: