MST

星途 面试题库

面试题:TypeScript 泛型推导在条件类型和映射类型中的综合应用

编写一个 TypeScript 类型工具 `SelectivePick`,它接受两个类型参数 `T` 和 `K`。`K` 是一个字符串字面量联合类型。`SelectivePick` 应该返回一个新类型,该类型从 `T` 中选择那些类型为字符串的属性,并且属性名在 `K` 中。例如,`type Example = { name: string; age: number; address: string }; type Keys = 'name' | 'address'; type Result = SelectivePick<Example, Keys>;`,`Result` 应该是 `{ name: string; address: string }`。请详细说明实现过程中泛型推导是如何与条件类型和映射类型协同工作的。
46.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
type SelectivePick<T, K extends keyof T> = {
    [P in K as T[P] extends string ? P : never]: T[P];
};

泛型推导、条件类型与映射类型协同工作说明

  1. 映射类型
    • [P in K as T[P] extends string ? P : never]: T[P]; 这部分是一个映射类型。P in K 表示遍历联合类型 K 中的每一个属性名。对于 K 中的每一个属性名 P,我们将在新类型中创建一个对应的属性。
  2. 条件类型
    • as T[P] extends string ? P : never 这是一个条件类型。它会检查 T 类型中属性 P 的类型是否为 string。如果是,则保留属性名 P,否则使用 never。这确保了我们只选择类型为 string 的属性。如果属性 P 的类型不是 stringnever 会使得该属性不会出现在最终的类型中。
  3. 泛型推导
    • T 是一个泛型类型参数,它代表任意一个对象类型。K 是另一个泛型类型参数,它必须是 T 的键的联合类型(K extends keyof T)。通过这种方式,我们确保 K 中的属性名确实存在于 T 中。在整个类型工具的实现过程中,TK 被泛型推导,根据传入的具体类型实参来生成相应的新类型。比如传入 ExampleKeys,就会生成 { name: string; address: string } 类型。