0 Tage Serie
typescript / expert
Snippet

Typsicheres Currying via variadische Tupel-Inferenz

Variadische Tupel erlauben es, die Parameterliste einer Funktion als generisches Tupel zu behandeln und Parameter Schritt für Schritt abzutragen. Der Curry-Typ rekursiert durch das Tupel: Jeder Schritt liefert eine unäre Funktion, deren Rückgabetyp entweder das Endergebnis R oder der nächste Curry-Schritt ist. Da das Parameter-Tupel generisch erfasst wird, fließen Namen und Typen jedes Arguments lückenlos durch — ein vollständig typsicherer Curry-Helfer für beliebige Aritäten.

snippet.ts
typescript
1
2
3
4
5
6
7
8
9
10
type Curry<P extends unknown[], R> =
P extends [infer H, ...infer T]
? T extends [] ? (arg: H) => R : (arg: H) => Curry<T, R>
: R;
declare function curry<P extends unknown[], R>(fn: (...args: P) => R): Curry<P, R>;
const add = (a: number, b: number, c: number) => a + b + c;
const curried = curry(add);
const result = curried(1)(2)(3);
Erklärung
1
type Curry<P extends unknown[], R> =
Mapped Type, der ein Parameter-Tupel P und Rückgabetyp R in eine curried-Signatur überführt.
2
P extends [infer H, ...infer T]
Mustererkennt Kopf H und Rest T aus dem Parameter-Tupel via variadische Inferenz.
3
? T extends [] ? (arg: H) => R : (arg: H) => Curry<T, R>
Basisfall liefert R; sonst Rekursion mit den verbleibenden Parametern.
4
const result = curried(1)(2)(3);
Jeder Aufruf verkleinert das Tupel; der letzte Aufruf wird als number inferiert.