ProgrammazioneSviluppatore Fullstack

Как реализовать и правильно типизировать функцию обратного вызова (callback) с параметрами, которые могут быть опциональными или иметь значения по умолчанию? Какие сложности могут возникнуть и как их избежать?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Per i parametri opzionali si utilizza il simbolo "?".
  • Per i valori di default si specifica il valore predefinito nella definizione della funzione.
  • La tipizzazione facilita la manutenzione del codice e riduce il numero di errori.

Domande trabocchetto.

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.

Errori comuni e anti-pattern

  • Violazione dell'ordine dei parametri obbligatori e opzionali (prima i parametri obbligatori, poi quelli opzionali).
  • Mancanza di indicazione esplicita dei tipi o uso di "any" — porta alla perdita dei vantaggi di TypeScript.
  • Tentativi di passare undefined invece di un valore e aspettare che si attivi il valore di default (che si attiva solo in assenza di argomento).

Esempio dalla vita reale

Caso negativo

Il secondo argomento della callback è stato contrassegnato come obbligatorio, ma nella chiamata non è stato passato. Si è ricevuto un errore di compilazione.

Pro:

  • Codice scritto rapidamente e semplicemente senza chiarimenti.

Contro:

  • Non compila.
  • Perdita di flessibilità e responsabilità poco chiara.

Caso positivo

Tipo la callback con un parametro opzionale:

(cb: (x: number, y?: number) => void)

oppure ho definito un default:

f = (x: number, y = 10) => { ... }

Pro:

  • Garanzia di assenza di errori durante le chiamate delle callback.
  • Leggibilità e manutenibilità.

Contro:

  • È necessario prestare attenzione all'ordine dei parametri.