export type ArgTypes = T extends (...args: infer A) => any ? A : never; export type ArgType = F extends (arg: infer A) => any ? A : Else; export type ReplaceReturnTypePromise = (...a: ArgTypes) => Promise; export type VariadicFunction = (...args: any[]) => any; export type Lookup = K extends keyof T ? T[K] : Default; export type Tail = ((...t: T) => void) extends ((x: any, ...u: infer U) => void) ? U : never; export type Head = T extends [infer U, ...any[]] ? U : never; export type UnpackPromise = T extends Promise> ? U[] : T extends Promise ? D : T; export type LastIndexOf = ((...x: T) => void) extends ((y: any, ...z: infer U) => void) ? U['length'] : never;