ts的Partial和Pick

122 阅读1分钟

1.Partial(将其转为可选的属性)

[P in keyof T]? 遍历对象的所有属性将其变为可选的,T[P]获取对象的属性值的约束(例如string)

image.png

/**
 * 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 限制其属性只能是对象的属性,不能为该对象其他没有的属性

image.png

/**
 * 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"]