TypeScript supporta la tipizzazione precisa delle funzioni utilizzando parametri rest e destructuring. Questo è particolarmente importante per le funzioni che accettano un numero variabile di argomenti o oggetti complessi.
Destructuring nei parametri della funzione consente di specificare esplicitamente la struttura delle proprietà attese:
function printUser({ name, age }: { name: string; age: number }) { console.log(`${name} (${age})`); }
I parametri rest consentono di specificare un numero variabile di argomenti e il loro tipo:
function sum(...numbers: number[]): number { return numbers.reduce((acc, cur) => acc + cur, 0); }
L'uso combinato si verifica in funzioni che accettano un oggetto principale e un array di parametri aggiuntivi:
function logEvent(event: { type: string }, ...meta: any[]) { console.log(event.type, meta.join(',')); }
Una corretta tipizzazione consente di individuare errori prima dell'esecuzione del codice, ma una tipizzazione errata porterà a una perdita della sicurezza dei tipi e errori a runtime.
Come impostare il tipo per una funzione con parametri destructurizzati di default e renderli opzionali?
Molti specificano il tipo dell'oggetto, ma dimenticano di rendere ogni campo opzionale o di impostare valori predefiniti contemporaneamente al tipo:
function foo({x = 1, y = 2}: {x?: number; y?: number} = {}) { console.log(x, y); }
Qui sono stati impostati valori predefiniti e tutti i parametri sono resi opzionali tramite ?. Senza questo, la chiamata senza parametri genererà un errore, sebbene ci si aspetti un default.
Storia
undefined non ha la proprietà name.Storia
any[], consentendo di passare non solo numeri. In produzione, hanno improvvisamente sommato numeri e stringhe, ottenendo risultati errati nei report.Storia
Hanno utilizzato il destructuring con un oggetto profondamente annidato, ma non hanno specificato i tipi annidati. Di conseguenza, TS si è "perso" e non ha suggerito l'assenza di un campo obbligatorio negli oggetti, portando a TypeError: Cannot read property 'id' of undefined sul lato client.