type Dec = Record<number, never> & [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
type A = Dec[12]
type Overload<T extends Signature[]> = {
[K in number & keyof T]: (...args: Args<T[K]>) => Return<T[K]>
}
type Args<S extends Signature> = any[] & {
[K in number & Exclude<keyof S, Dec[S['length']]>]: S[K] extends (arg: any) => arg is infer A ? A : any
}
type Return<S extends Signature> = ReturnType<Dec[S['length']]>
type Signature<R extends number = 2 | 3 | 4 | 5, L = R> = L extends R ?
{ length: L }
& Record<Dec[L], (...args: TupleN<Dec[L]> }) => any>
: never
type PrependTuple<T extends Array<any>, A = any> =
(((a: A, ...b: T) => void) extends (...a: infer I) => void ? I : [])
type TupleN<N extends number, L extends Array<any> = [], T = any> = {
true: L;
false: TupleN<N, PrependTuple<L, T>, T>
}[L['length'] extends N ? "true" : "false"]
type Result = TupleN<3>
type Inc<T extends number> = PrependTuple<TupleN<T>>['length']
Last active
July 8, 2019 13:06
-
-
Save sonhanguyen/d7cf1a68b206b3f194f560cea4424b80 to your computer and use it in GitHub Desktop.
esnextbin sketch
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment