Skip to content

Instantly share code, notes, and snippets.

@sonhanguyen
Last active July 8, 2019 13:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sonhanguyen/d7cf1a68b206b3f194f560cea4424b80 to your computer and use it in GitHub Desktop.
Save sonhanguyen/d7cf1a68b206b3f194f560cea4424b80 to your computer and use it in GitHub Desktop.
esnextbin sketch
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']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment