feng xiaohan

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];
};