In TypeScript, i tipi any, unknown e object sono utilizzati per scenari diversi e presentano differenze chiave:
any: disabilita il sistema di tipizzazione per la variabile. Permette di fare qualsiasi operazione sulla variabile senza generare errori di compilazione. Utilizza any quando il tipo di oggetto è sconosciuto a priori e la sicurezza non è critica.unknown: anch'esso accetta qualsiasi tipo, ma per lavorare con tali variabili è necessaria una verifica esplicita/casting del tipo. È più sicuro di any. Utilizzalo per valori di tipo sconosciuto, in modo da non perdere il controllo sulla tipizzazione.object: tipo solo per oggetti non primitivi (oggetti, array, funzioni), ma non per primitive (numeri, stringhe). Limita l'operazione solo agli oggetti.let a: any = 1; a = 'string'; // OK a(); // OK (ma potrebbe causare errori a runtime) let b: unknown = 'hello'; b = 5; // OK // b.toUpperCase(); // Errore — è richiesta una verifica del tipo if (typeof b === 'string') { console.log(b.toUpperCase()); } let c: object = { key: 'value' }; c = [1, 2, 3]; // OK // c = 1; // Errore, poiché '1' non è un oggetto
Domanda: Qual è il vantaggio del tipo unknown, se possiamo usare any?
Risposta: unknown aumenta la sicurezza del codice — non sarà possibile eseguire azioni non verificate sulla variabile come con any. È necessario verificare o fare casting esplicito, il che esclude molte sorprese durante l'esecuzione.
function handle(value: unknown) { // value.trim(); // Errore if (typeof value === 'string') { value.trim(); } }
Storia
Nel progetto è stata presa la decisione di integrare rapidamente una libreria di terze parti, descrivendo il suo risultato tramite any, per non preoccuparsi dei tipi. Di conseguenza, a runtime è stato scoperto che la libreria restituiva non un array, ma un oggetto con campi, il che ha causato errori massivi nel metodo .map() — questo codice si compilava, ma si bloccava durante l'esecuzione.
Storia
Uno degli sviluppatori ha usato unknown per i dati provenienti dal backend, ma non ha aggiunto verifiche di tipo prima di lavorare con i campi. Di conseguenza, TypeScript non ha compilato il codice — e si è dovuto cambiare rapidamente in any, il che ha nascosto potenziali errori di parsing e ha portato a bug in produzione a causa di formati di dati non corretti.
Storia
Durante il lavoro con il tipo object è sorto un malinteso: si cercava di assegnare a una variabile di tipo object valori di tipo string e number. Anche se durante lo sviluppo non si notavano inganni, nel processo di revisione sono stati individuati errori relativi al fatto che i metodi dell'oggetto non funzionavano con i primitivi. Ci è voluto tempo aggiuntivo per risolvere il problema.