Per descrivere strutture dati complesse in TypeScript si utilizzano le interfacce (interface) e gli alias di tipo (type). È possibile combinarli con oggetti, array e tipi annidati per una tipizzazione rigorosa delle collezioni complesse.
Per un oggetto annidato:
interface Address { city: string; zip: number; } interface UserProfile { name: string; age: number; address: Address; }
Per un array con tipi differenti:
// Tupla let tuple: [string, number] = ['John', 30]; // Array con tipi union let arr: (string | number)[] = [1, 'a', 2, 'b']; // Array di oggetti let users: UserProfile[] = [ {...}, {...} ];
Quando le strutture sono complesse e ci sono campi opzionali, si utilizza ?, si combinano con i tipi Partial, Record, Mapped Types, o tipi ricorsivi per alberi annidati.
Domanda: È possibile utilizzare un'interfaccia per descrivere un array con elementi di tipi diversi (ad esempio, [string, number, boolean])?
Risposta: No. In questo caso è meglio utilizzare tuple — le interfacce non sono adatte per posizioni e tipi fissi. Le tuple consentono di definire rigorosamente i tipi per ciascuna posizione.
type MyTuple = [string, number, boolean]; let foo: MyTuple = ['ok', 12, false];
Storia
Nel progetto è stata descritta in modo errato una struttura complessa: per un array di tipi misti è stato utilizzato any[] invece di una corretta tupla o di un tipo union. Di conseguenza, uno degli elementi conteneva un valore di tipo errato, causando un errore nella logica aziendale (operazione aritmetica con una stringa).
Storia
Nella struttura dati, oggetti annidati a profondità erano stati dichiarati senza utilizzare tipi ricorsivi o Partial. Tentare di aggiungere un nuovo sottoalbero a un nodo dell'albero generava un errore del compilatore e gli sviluppatori lo aggiravano tramite downcast in any, causando successivamente bug di runtime in produzione.
Storia
Un oggetto con la descrizione del profilo utente era parzialmente opzionale, ma lo sviluppatore non aveva utilizzato ?. Quando si ricevevano dati dal server, TypeScript non segnalava errori, ma l'applicazione andava in crash tentando di accedere ai campi che non esistevano nell'oggetto.