ts之高阶使用infer (简单的定义 数组、infer U做占位符、infer U做占位符 - 联合类型、infer U做占位符 - 提取数组之中的某一项元素)

ts之高阶使用infer

  • infer的作用 新增的关键字-用于占位符
// infer的作用 新增的关键字-用于占位符
// 需求:定义一个类型 如果是数组类型 就返回 数组元素的类型 否则 就传入什么类型 就返回什么类型
// 01:简单的定义 数组
type TYPE<T> = T extends Array<any> ? T[number] : T;
type AAAA = TYPE<string[]>;
let aaaa: AAAA = "111";

type BBBB = TYPE<boolean>;
let bbbb: BBBB = true;

// 02:使用infer U做占位符
type TYPE2<T> = T extends Array<infer U> ? U : T;
type AAAA2 = TYPE2<(string | number)[]>;
let aaaa2: AAAA2 = 1;

type BBBB2 = TYPE2<boolean>;
let bbbb2: BBBB2 = true;

// 03:使用infer U做占位符 - 联合类型
type TYPE3<T> = T extends Array<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<T extends any[]> = T extends [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<T extends any[]> = T extends [...any[], infer Last] ? Last : [];
type b = Last<Arr>; // type b = "c"

// 04-3 删除最后面一项
type Pop<T extends any[]> = T extends [...infer Rest, infer Last] ? Rest : [];
type c = Pop<Arr>; // type c = ["a", "b"]

// 04-3 删除最前面一项
type Shif<T extends any[]> = T extends [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<T extends any[]> = T extends [infer First, ...infer Rest] ? [...ReverArr<Rest>,First] : T;
type ArrRever = ReverArr<Arr2> // type ArrRever = [4, 3, 2, 1]

猜你喜欢

转载自blog.csdn.net/weixin_47409897/article/details/129206101