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.