Storia della domanda:
Le funzioni di callback sono una pratica comune in JS e TS per la programmazione asincrona e la delega della responsabilità. In TypeScript, la tipizzazione di tali funzioni è una parte importante della garanzia di sicurezza, specialmente se i parametri possono essere opzionali o avere valori di default.
Problema:
In JS dinamico, l'assenza di tipizzazione degli argomenti di callback porta a errori nella trasmissione dei valori, confusione con undefined e ordine errato dei parametri. In TypeScript, la tipizzazione è richiesta per evitare questi problemi, ma è difficile rispettare tutte le sfumature relative all'opzionalità, all'ordine e ai valori di default.
Soluzione:
Specificare esplicitamente i tipi di tutti i parametri, contrassegnare i parametri opzionali con un punto interrogativo e indicare i valori di default direttamente durante la dichiarazione della funzione, ricordandosi di descriverli correttamente nel tipo.
Esempio di codice:
function fetchData( url: string, callback: (data: any, error?: Error) => void ) { // ... } // Callback con parametro opzionale error fetchData('/api', (data, error) => { if (error) { // gestione } else { // successo } }); // Callback con parametro di default function process( cb: (x: number, y?: number) => void = (x, y = 10) => { /* ... */ } ) { /* ... */ }
Caratteristiche chiave:
Il consumatore della callback deve considerare esplicitamente tutti i parametri, inclusi quelli opzionali?
No, può omettere i parametri opzionali, e TypeScript non genererà un errore: la gestione avviene correttamente grazie alla sintassi del punto interrogativo.
È possibile rendere il primo parametro della callback opzionale e il secondo obbligatorio?
No. I parametri opzionali devono sempre andare alla fine dell'elenco degli argomenti. Violare questo ordine porterà a un errore di tipizzazione.
Cosa accade se non si indica l'opzionalità di un parametro ma non lo si passa al momento della chiamata?
TypeScript genererà un errore: se il parametro è obbligatorio, deve essere passato. Solo i parametri opzionali o con default possono essere omessi.
Il secondo argomento della callback è stato contrassegnato come obbligatorio, ma nella chiamata non è stato passato. Si è ricevuto un errore di compilazione.
Pro:
Contro:
Tipo la callback con un parametro opzionale:
(cb: (x: number, y?: number) => void)
oppure ho definito un default:
f = (x: number, y = 10) => { ... }
Pro:
Contro: