Skip to content

Instantly share code, notes, and snippets.

@z7pz
Created April 11, 2025 08:32
Show Gist options
  • Save z7pz/ae58fba399b38a40ce0e69d1cff8d560 to your computer and use it in GitHub Desktop.
Save z7pz/ae58fba399b38a40ce0e69d1cff8d560 to your computer and use it in GitHub Desktop.
type challenge typescript curried.ts
type Curried<A, R, Args extends any[] = []> = A extends []
? R
: A extends [infer Head, ...infer Tail]
? { (...args: [...Args, Head]): Curried<Tail, R> } & (Tail extends []
? {}
: Curried<Tail, R, [...Args, Head]>)
: never;
declare function DynamicParamsCurrying<Args extends any[], Ret>(
fn: (...args: Args) => Ret
): Curried<Args, Ret>;
const add = (a: number, b: number, c: number) => a + b + c;
const three = add(1, 1, 1);
const curriedAdd = DynamicParamsCurrying(add);
const six = curriedAdd(1, 2, 3);
const seven = curriedAdd(1, 2)(4);
const eight = curriedAdd(2)(3)(4);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment