TS高级-infer
用于在泛型中推导类型。它通常与extends关键字一起使用,用于从一个类型中提取出另一个类型,并将其作为泛型参数的类型。
应用
定义一个类型就返回一个类型
type Type<T> = T extends Array<infer U> ? U : T; // infer U会充当一个占位符,去读取Array里的类型,然后再返回 type A = Type<(string | number)[]>; // type A = string | number type B = Type<boolean>; // type B = boolean例 2:
// 定义一个类型只能返回元组类型,其他的类型返回都会为never type Type<T> = T extends Array<infer U> ? U : never; type T = [string, number]; type union = Type<T>; // 返回一个有T类型里的值组成的联合类型 type union = string | number
类型提取和删除
type First<T extends any[]> = T extends [infer one, infer two, infer three]
? one
: [];
提取头部元素
type First<T extends any[]> = T extends [infer one, ...any[]] ? one : [];
type Arr = ["a", "b", "c"];
type a = First<Arr>; // type a = 'a'
提取尾部元素
type Last<T extends any[]> = T extends [...any[], infer last] ? last : [];
type Arr = ["a", "b", "c"];
type a = Last<Arr>; // type a = 'c'
删除尾部元素
type Pop<T extends any[]> = T extends [...infer Rest, popOne] ? Rest : [];
type Arr = ["a", "b", "c"];
type a = Last<Arr>; // type a = ['a', 'b']
删除头部元素
type Shift<T extends any[]> = T extends [shiftOne, ...infer Rest] ? Rest : [];
type Arr = ["a", "b", "c"];
type a = Shift<Arr>; // type a = ['b', 'c']
infer 递归
使用infer递归实现数组反转。
**实现思路:***定义一个ReverArr使用infer将数组的第一个取出来放到最后一个元素中,剩下的元素继续组成数组传入这个ReverArr,实现递归调用,直到再也没有剩下的元素返回。*
type ReverArr<T extends any[]> = T extends [infer First, ..infer rest] ? [...ReverArr<rest>, First] : T
type Arr = [1, 2, 3, 4]
type ArrRe = ReverArr<Arr> // type ArrRe = [4, 3, 2, 1]