//=========源码========= /** * Construct a type with a set of properties K of type T */ type Record<K extends keyof any, T> = { [P in K]: T; }; //=========使用========= type Peron = { name: string, age: number } type A = 'A' | 12 | 'N'; type p = Record<A, Peron>
//=========转换成========= type p = { A: Peron; 12: Peron; N: Peron; }
infer
infer 是TypeScript 新增到的关键字 充当占位符
定义一个类型 如果是数组类型 就返回 数组元素的类型 否则 就传入什么类型 就返回什么类型
1 2 3 4 5 6 7 8 9 10 11
//定义一个类型 如果是数组类型 就返回 数组元素的类型 否则 就传入什么类型 就返回什么类型
type TYPE<T> = T extendsArray<any> ? T[number] : T; type A=TYPE<(string | number)[]> type B=TYPE<string>
//使用inter修改 type TYPE<T> = T extendsArray<infer U> ? U : T; type A=TYPE<(string | number)[]> type B=TYPE<string>
infer 类型提取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
type Arr = ['a', 'b', 'c', 'd', 'e', 'f']; //提取头部元素 type FirstType<T extendsany[]> = T extends [infer First, ...any[]] ? First : never; type a = FirstType<Arr>
//提取尾部元素 type LastType<T extendsany[]> = T extends [...any[], infer Last] ? Last : never; type b = LastType<Arr>
//剔除第一个元素 type EliminateFirst<T extendsany[]> = T extends [unknown, ...infer Rest] ? Rest : never; type c = EliminateFirst<Arr>
//剔除尾部元素 type EliminateLast<T extendsany[]> = T extends [...infer Rest, unknown] ? Rest : never; type d = EliminateLast<Arr>
infer 梯归
1 2 3
type a=[1,2,3,4] type ReverseArr<T extendsany[]>=T extends [infer First,...infer rest] ? [...ReverseArr<rest>,First]:T; type b=ReverseArr<a>;//type b = [4, 3, 2, 1]