1、取第一个值
type FirstItem<T extends any[]> = T[0]
type A = FirstItem<[1, 2, 3]>
type B = FirstItem<[string, number, boolean]>
type C = FirstItem<[]>
2、取最后一个值
type LastItem<T extends any[]> = T extends [...any, infer L] ? L : never
type D = LastItem<[1, 2, 3]>
type E = LastItem<[string, number, boolean]>
type F = LastItem<[]>
3、Shift
type Shift<T extends any[]> = T extends [infer F, ...infer L] ? L : never
type G = Shift<[1, 2, 3]>
type H = Shift<[string]>
type I = Shift<[]>
4、Push
type Push<T extends any[], E> = [...T, E]
type A1 = Push<[1, 2, 3], 4>
type B1 = Push<[string], number>
type C1 = Push<[], boolean>
5、数组反转
type Reverse<T extends any[], R extends any[] = []> = T extends [infer F, ...infer L] ?
Reverse<L, [F, ...R]> : R
type A2 = Reverse<[1, 2, 3]>
type B2 = Reverse<[string, number]>
type C2 = Reverse<[]>
6、数组扁平化
type Flatten<T extends any[]> = T extends [infer F, ...infer L] ?
[...(F extends any[] ? Flatten<F> : [F]), ...Flatten<L>] :
[]
type A3 = Flatten<[1, 2, [3, 4, [5, 6]]]>
type B3 = Flatten<[]>
7、重复值组成数组
type Repeat<T, N extends number, R extends any[] = []> = R['length'] extends N ?
R :
Repeat<T, N, [T, ...R]>
type A4 = Repeat<1, 5>
8、筛选出数组中的某些值
type Filter<T extends any[], Target, R extends any[] = []> = T extends [infer F, ...infer L] ?
Filter<L, Target, ([F] extends [Target] ? [...R, F] : R)> :
R
type A5 = Filter<[1, '2', 3, any, '5'], number>
9、查找元素,返回索引
type isEqual<T, U, S, F> = [T] extends [U] ?
[U] extends [T] ?
keyof T extends keyof U ?
keyof U extends keyof T ?
S :
F :
F :
F :
F
type FindIndex<T extends any[], Target, R extends any[] = []> = T extends [infer F, ...infer L] ?
isEqual<F, Target, R['length'], FindIndex<L, Target, [...R, F]>> :
never
type A6 = FindIndex<[1, '2', 3, any, '5'], '5'>
10、元组转枚举
type TupleToEnum<T extends any[], R = false> = {
[key in T[number]]: isEqual<R, false, key, FindIndex<T, key>>
}
type A7 = TupleToEnum<['a', 'b', 'c']>
type B7 = TupleToEnum<['a', 'b', 'c'], true>