实现Pick工具类

143 阅读1分钟

Pick 泛型工具类

可以从一个对象类型中,选出一些属性,并生成新的类型

interface Person {
  name: string;
  age: number;
  gender: string;
}

//从 Person 属性中,选出 name 和 age 属性
//生成新的对象类型,并赋值给 P
//Pick单词本身就有 挑选 的意思
type P = Pick<Person, "name" | "age">;

//  此时P类型为 
//  {
//   name: string;
//   age: number;
//  }
const per: P = {
  name: "小王",
  age: 34,
};

我们自己实现一个 Pick 工具类

相关知识:
联合类型: 多个类型 用 | 符号分隔,只要满足其中一个或多个类型即可
例: type a = number | string | boolean

in: 用于遍历 interface联合类型 的属性 例

interface Person {
  name: string;
  age: number;
  gender: string;
}

//定义类型 MyPick为泛型,接收两个参数
//第一个参数 T,为标准对象类型
//第二个参数 K,继承 T类型的 键组成的联合类型
type MyPick<T, K extends keyof T> = {
//此时 K 为 "name"|"age"|"gender" 类型
//具体的 K类型,要看使用时,传入了什么类型
// 而 P 用 in 关键字,遍历了 K
//如果 K 为 “name” | “age"
//则 P 将遍历K,生成两次,一次为 “name”,一次为 “age”
//则 T[P] 也生成两次,一次为 string,一次为 number
  [P in K]: T[P];
};

//使用 MyPick,第一个参数为一个对象类型 Person
// 第二个类型要符合 K extends keyof T
//也就是, "name" | "age" | "gender"
//上面说了,联合类型:满足其中一个或多个即可
type myP = MyPick<Person, "name" | "age">;

const myPer: myP = {
  name: "小王",
  age: 22,
};