Typing a Flexible curry Function
type Curried<A extends any[], R extends any> = A extends [infer F, ...infer L]
? <K extends Overloads<L>>(
arg: F,
...args: K
) => Curried<Remove<L, K>, R>
: R;
type Curried<A extends any[], R extends any> = A extends [infer F, ...infer L]
? <K extends Overloads<L>>(
arg: F,
...args: K
) => Curried<Remove<L, K>, R>
: R;