UNPKG

typescript-type

Version:
39 lines (24 loc) 1.05 kB
/** Prepend */ export type Prepend<E, T extends any[]> = ((head: E, ...args: T) => any) extends ((...args: infer U) => any) ? U : T; /** Head */ export type Head<T extends any[]> = T extends [any, ...any[]] ? T[0] : never; /** Tail */ export type Tail<T extends any[]> = ((..._: T) => any) extends ((_: any, ...args: infer TT) => any) ? TT : never; export type HasTail<T> = T extends ([] | [any]) ? false : true; /** Last */ export type Last<T extends any[]> = { 0: Last<Tail<T>>; 1: Head<T>; }[HasTail<T> extends true ? 0 : 1]; /** Length */ export type Length<T extends any[]> = T['length']; export type SameLength<T1 extends any[], T2 extends any[]> = Length<T1> extends Length<T2> ? true : false; export type TupleWithLength<N extends number, T2, I extends any[] = []> = { 0: TupleWithLength<N, T2, Prepend<T2, I>>; 1: I; }[Length<I> extends N ? 1 : 0]; /** Drop */ export type Drop<N extends number, T extends any[], I extends any[] = []> = { 0: Drop<N, Tail<T>, Prepend<any, I>>; 1: T; }[Length<I> extends N ? 1 : 0];