types
AnyFn
ts
export type AnyFn = (...args: any[]) => any;
Head
获取第一个类型
ts
export type Head<T extends any[]> = T extends [any, ...any[]] ? T[0] : never;
ts
Head<[number, string]>; // number
Tail
获取剩余类型
ts
export type Tail<T extends any[]> = T extends [any, ...infer Rest] ? Rest : [];
ts
Tail<[number, string, boolean]>; // [string, boolean]
Last
获取最后一个类型
ts
export type Last<T extends any[]> = {
0: Last<Tail<T>>;
1: Head<T>;
}[HasTail<T> extends true ? 0 : 1];
ts
Last<[string, number]>; // number
HasTail
是否还有剩余参数
ts
export type HasTail<T extends any[]> = T extends [] | [any] ? false : true;
ts
HasTail<[]>; // false
HasTail<[number]>; // false
HasTail<[number, string]>; // true
Length
ts
export type Length<T extends any[]> = T["length"];
Prepend
元组顶部添加一个类型
ts
export type Prepend<E, T extends any[]> = [E] extends [never] ? T : [E, ...T];
ts
Prepend<number, [string, boolean]>; // [number, string, boolean]
Drop
丢弃元组前 N 个类型
ts
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];
ts
Drop<2, [0, 1, 2]>; // [2]
Cast
X 是 Y 的子集则校验类型为 X,否则使用 Y 类型校验
ts
export type Cast<X, Y> = X extends Y ? X : Y;
Iterator
创建位于Index
定义位置的迭代器,可选通过使用From
从另一个迭代器的位置开始
ts
export type Iterator<
Index extends number = 0,
From extends any[] = [],
I extends any[] = []
> = {
0: Iterator<Index, Next<From>, Next<I>>;
1: From;
}[Pos<I> extends Index ? 1 : 0];
ts
type iterator1 = Iterator<2>; // [any, any]
Iterator<1, iterator1>; // [any, any, any]
Pos
查询迭代器位置
ts
export type Pos<I extends any[]> = Length<I>;
ts
Pos<[0, 0]>; // 2
Post<Iterator<5>>; // 5
Next
迭代器+1
ts
export type Next<I extends any[]> = Prepend<any, I>;
ts
Next<Iterator<0>>; // [any]
Prev
迭代器-1
ts
export type Prev<I extends any[]> = Tail<I>;
ts
Prev<Iterator<2>>; // [any]
Append
追加元组条目
ts
export type Append<E, T extends any[]> = Concat<T, E>;
ts
type xs1 = [0, 1];
Append<2, xs1>; // [0, 1, 2]
Reverse
反转元组
ts
export type Reverse<
T extends any[],
R extends any[] = [],
I extends any[] = []
> = {
0: Reverse<T, Prepend<T[Pos<I>], R>, Next<I>>;
1: R;
}[Length<T> extends Pos<I> ? 1 : 0];
ts
Reverse<[0, 1, 2]>; // [2, 1, 0]
Concat
ts
export type Concat<T, U> = T extends any[]
? U extends any[]
? [...T, ...U]
: [...T, U]
: U extends any[]
? [T, ...U]
: [T, U];
ts
Concat<string, 0>; // [string, 0]
Concat<0, [1, 2]>; // [0, 1, 2]
Concat<[3, 4], 5>; // [3, 4, 5]