typescript / expert
Snippet
Typinferenz für Currying von höherwertigen variadischen Funktionen
Dieses Beispiel implementiert vollständiges Currying auf Typebene mittels variadischer Tupel-Inferenzen. Durch Rekursion über Funktionsargument-Tupel mit 'infer Head' und 'infer Tail' garantiert TypeScript die korrekte Typprüfung und Autovervollständigung in jedem Aufrufschritt der Curried-Kette.
snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type Curried<Args extends any[], Return> = Args extends [infer Head, ...infer Tail]? Tail extends []? (arg: Head) => Return: (arg: Head) => Curried<Tail, Return>: () => Return;function curry<Args extends any[], Return>(fn: (...args: Args) => Return): Curried<Args, Return> {return function curried(...args: any[]): any {if (args.length >= fn.length) {return fn(...(args as any));}return (nextArg: any) => curried(...args, nextArg);} as Curried<Args, Return>;}const addThree = (a: number, b: string, c: boolean): string => `${a}-${b}-${c}`;const curriedAdd = curry(addThree);const result = curriedAdd(42)("hello")(true);
Erklärung
1
type Curried<Args extends any[], Return> = Args extends [infer Head, ...infer Tail]
Zerstört Funktionsargument-Tupel in den ersten Argumenttyp (Head) und das verbleibende Argument-Tupel (Tail).
2
? (arg: Head) => Curried<Tail, Return>
Gibt eine einstellige Funktion zurück, die Head erwartet und zu einem weiteren Curried-Typ für Tail ausgewertet wird.
3
function curry<Args extends any[], Return>(fn: (...args: Args) => Return): Curried<Args, Return>
Hüllt eine gewöhnliche Mehrparameter-Funktion in ihre typsichere gecurryte Repräsentation ein.
4
const result = curriedAdd(42)("hello")(true);
Führt nacheinander verkettete Einzelaufrufe aus und behält bei jedem Schritt die präzisen Parametertypen bei.