typescript-type
Version:
Typescript type
39 lines (24 loc) • 1.05 kB
text/typescript
/** 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];