Hintergrund:
Callback-Funktionen sind eine gängige Praxis in JS und TS für asynchrone Programmierung und Delegation von Verantwortung. In TypeScript ist die Typisierung solcher Funktionen ein wichtiger Bestandteil der Sicherheit, insbesondere wenn die Parameter optional sein oder Standardwerte haben können.
Problem:
Im dynamischen JS führt das Fehlen der Typisierung von Callback-Argumenten zu Fehlern bei der Wertübergabe, Verwirrung mit undefined und falscher Parameterreihenfolge. In TypeScript ist die Typisierung erforderlich, um solche Probleme zu vermeiden, aber draußen ist es schwierig, alle Feinheiten in Bezug auf Optionalität, Reihenfolge und Standardwerte einzuhalten.
Lösung:
Alle Parametertypen explizit angeben, optionale Parameter mit einem Fragezeichen kennzeichnen und Standardwerte direkt bei der Funktionsdeklaration angeben, und nicht vergessen, diese korrekt im Typ zu beschreiben.
Beispielcode:
function fetchData( url: string, callback: (data: any, error?: Error) => void ) { // ... } // Callback mit optionalem Parameter error fetchData('/api', (data, error) => { if (error) { // Verarbeitung } else { // Erfolg } }); // Callback mit Standardparameter function process( cb: (x: number, y?: number) => void = (x, y = 10) => { /* ... */ } ) { /* ... */ }
Wichtige Merkmale:
Muss der Verbraucher des Callbacks alle Parameter, einschließlich der optionalen, explizit berücksichtigen?
Nein, er kann optionale Parameter weglassen, und TypeScript gibt keinen Fehler aus — die Verarbeitung erfolgt korrekt dank der Syntax des Fragezeichens.
Kann der erste Parameter im Callback optional sein, während der zweite obligatorisch ist?
Nein. Optionale Parameter müssen immer am Ende der Argumenteliste stehen. Eine Verletzung der Reihenfolge führt zu einem Typisierungsfehler.
Was passiert, wenn man die Optionalität eines Parameters nicht angibt, ihn aber bei der Aufrufstelle nicht übergibt?
TypeScript gibt einen Fehler aus — wenn der Parameter obligatorisch ist, muss er übergeben werden. Nur optionale oder solche mit Default können weggelassen werden.
Der zweite Argument des Callbacks wurde als obligatorisch deklariert, aber im Aufruf nicht übergeben. Dies führte zu einem Kompilierungsfehler.
Vorteile:
Nachteile:
Typisiert Callback mit optionalem Parameter:
(cb: (x: number, y?: number) => void)
oder legte einen Default fest:
f = (x: number, y = 10) => { ... }
Vorteile:
Nachteile: