实现Pick

76 阅读1分钟

题目解析

TypeScript中,Pick是一个内置的类型实用工具,它允许从一个接口或类型中选择一组指定属性,并创建一个新的类型,仅包含这些被选中的属性。假设我们有一个复杂的接口,但只需要其中几个属性来创建一个新的类型,这时Pick就显得尤为有用。

示例分析

interface User{
  id: number;
  name: string;
  email: string;
  age: number;
}

如果我们只想从User接口中提取idname属性来创建一个新的类型,我们可以这样做:

type PickedUser = Pick<User, 'id' | 'name'>

let user: PickedUser = {
  id: 1,
  name: "Alice"
}

这样,PickedUser就只包含了idname两个属性。

题解

type MyPick<T, K extends keyof T> = {
  [P in K]: T[P];
}
  • T代表原类型。
  • K extends keyof T意味着K必须是T的属性名,确保我们只能选择实际存在的属性。
  • [P in K]是映射类型的语法,遍历K中的每一属性名P
  • T[P]则获取T中每个属性P的类型。

知识点

  1. 映射类型:TypeScript中的映射类型允许你根据现有的类型中的属性创建新的类型。上面的[P in K]: T[P]就是一个映射类型的应用实例。
  2. 泛型:TK是泛型参数,使得MyPick类型更加灵活,可以应用于任何类型和该类型的一组属性上。
  3. 索引类型查询操作符(keyof): keyof T返回一个联合类型,包含了T的所有键名。通过K extends keyof T约束,确保了只能选择T中存在属性。
  4. 类型别名:type MyPick定义了新的类型别名,使得复杂的类型逻辑可以被重用和命名。

我是菜逼,大佬勿喷!