TS高级-Partial和Pick
Partial
将一个类型中的所有属性变为可选属性。
type Person = {
name: string;
age: number;
sex: string;
};
type p = Partial<Person>;
// type p = {
// name?: string |undefined;
// age?: number |undefined;
// sex?: string |undefined;
// }
原理
通过keyof获取类型的联合属性,再通过in操作符(可以理解为 for in)遍历这些属性,并给每个属性上添加可选操作符:
// type key = 'name' | 'age' | 'sex'
type Partial<T> = {
[P in keyof T]?: T[P];
};
Pick
从一个类型中选取部分属性。
interface Person {
name: string;
age: number;
gender: string;
}
type PersonNameAndAge = Pick<Person, "name" | "age">;
// PersonNameAndAge 的类型为:
// {
// name: string;
// age: number;
// }
Pick 类型接收两个参数:
<被选择的类型, 被选择的类型的属性(可以使用联合属性等)>
原理
接收两个泛型,一个泛型为被选择的对象,另一个为泛型为限制在通过keyof获取类型的联合属性里的泛型,再使用in操作符循环被选择的对象将其组合起来:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};