UNPKG

995 BPlain TextView Raw
1// Pending: https://stackoverflow.com/questions/68761267/capture-generic-type-of-passed-function-for-overloads-in-typescript
2// TODO: refactor "./value.ts" with this when/if resolved
3
4/* eslint-disable @typescript-eslint/no-explicit-any */
5export function curried<TLeadingParameters extends any[], TLastParameter, TReturn>(
6 fn: (...args: [...TLeadingParameters, TLastParameter]) => TReturn
7) {
8 return (...args: TLeadingParameters) =>
9 (curried: TLastParameter) =>
10 fn(...[...args, curried]);
11}
12
13type Leading<T extends any[]> = T extends [...infer I, infer _] ? I : never;
14type Last<T extends any[]> = T extends [...infer _, infer I] ? I : never;
15
16export function overloadWithCurried<F extends (...args: any) => any>(
17 fn: F
18): {
19 (...args: Parameters<F>): ReturnType<F>;
20 (...args: Leading<Parameters<F>>): (curried: Last<Parameters<F>>) => ReturnType<F>;
21} {
22 return (...args) =>
23 args.length == fn.length - 1 ? (curried: any) => fn(...[...args, curried]) : fn(...args);
24}
25