1.Partial(将其转为可选的属性)
[P in keyof T]? 遍历对象的所有属性将其变为可选的,T[P]获取对象的属性值的约束(例如string)
/**
* Make all properties in T optional
将T中的所有属性设置为可选
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
2.Pick(限制并筛选属性,例如只能是属性ABCD中的1-4种)
K extends keyof T 限制其属性只能是对象的属性,不能为该对象其他没有的属性
/**
* From T, pick a set of properties whose keys are in the union K
*/
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
3.infer妙用
type Arr = ['a','b','c']
/*
T extends any[] 传入一个泛型的any数组
[infer one,...any[]],取到第一个,然后使用es6的语法展开剩下的元素,符合就返回第一个元素,没有就返回空数组
*/
type First<T extends any[]> = T extends [infer one, ...any[]] ? one : []
type Last<T extends any[]> = T extends [ ...any[],infer last] ? last : []
type A = First<Arr> //type A = "a"
type B = Last<Arr> //type B = "c"
// infer实现数组翻转,可以使用递归
//...infer reset 剩下的参数
//[...reverArr<reset>,one] 将第一个元素放在最后面然后递归
type reverArr<T extends any[]> = T extends [infer one, ...infer reset] ? [...reverArr<reset>,one] : []
type C = reverArr<Arr> //type C = ["c", "b", "a"]