// infer的作用 新增的关键字-用于占位符// 需求:定义一个类型 如果是数组类型 就返回 数组元素的类型 否则 就传入什么类型 就返回什么类型// 01:简单的定义 数组
type TYPE<T>=TextendsArray<any>?T[number]:T;
type AAAA=TYPE<string[]>;letaaaa:AAAA="111";
type BBBB=TYPE<boolean>;letbbbb:BBBB=true;// 02:使用infer U做占位符
type TYPE2<T>=TextendsArray<infer U>?U:T;
type AAAA2=TYPE2<(string | number)[]>;letaaaa2:AAAA2=1;
type BBBB2=TYPE2<boolean>;letbbbb2:BBBB2=true;// 03:使用infer U做占位符 - 联合类型
type TYPE3<T>=TextendsArray<infer U>?U: never;
type TTTT=[number, string];
type uni =TYPE3<TTTT>;// type uni = string | number
type uni2 =TYPE3<boolean>;// type uni2 = never// 04:使用infer U做占位符 - 提取数组之中的某一项元素
type Arr =["a","b","c"];// 04-1 提取第一项
type First<Textendsany[]>=Textends[infer one, infer two,...any[]]? one // one => type a = "a"; two type a = "b";:[];
type a = First<Arr>;// type a = "a"// 04-2 提取最后一项
type Last<Textendsany[]>=Textends[...any[], infer Last]? Last :[];
type b = Last<Arr>;// type b = "c"// 04-3 删除最后面一项
type Pop<Textendsany[]>=Textends[...infer Rest, infer Last]? Rest :[];
type c = Pop<Arr>;// type c = ["a", "b"]// 04-3 删除最前面一项
type Shif<Textendsany[]>=Textends[infer Last,...infer Rest]? Rest :[];
type d = Shif<Arr>;// type d = ["b", "c"]// 05:使用infer U做占位符 - infer递归 ( 翻转数组 )
type Arr2 =[1,2,3,4];
type ReverArr<Textendsany[]>=Textends[infer First,...infer Rest]?[...ReverArr<Rest>,First]:T;
type ArrRever = ReverArr<Arr2>// type ArrRever = [4, 3, 2, 1]