MST

星途 面试题库

面试题:TypeScript中Pick工具类型在复杂类型场景下的深度应用

假设存在如下嵌套类型: ```typescript interface Address { street: string; city: string; zipCode: string; } interface Company { name: string; address: Address; employees: number; } ``` 要求编写一个类型`CompanyInfo`,它是从`Company`类型中提取`name`和`address`中的`city`属性组成的新类型,且要通过`Pick`以及其他合适的工具类型(如`DeepPick`,假设需自己实现此类型来处理嵌套结构)来实现。请写出完整的类型定义,并解释实现思路。
36.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 实现DeepPick类型
type DeepPick<T, K extends string> = {
    [P in K]: P extends keyof T
      ? T[P]
      : P extends `${infer First}.${infer Rest}`
        ? First extends keyof T
          ? DeepPick<T[First], Rest>
          : never
        : never;
};

这个DeepPick类型定义用于处理嵌套结构。它通过递归解析属性路径(例如address.city),如果路径存在则返回对应的值类型,否则返回never

  1. 定义CompanyInfo类型
type CompanyInfo = Pick<Company, 'name'> & {
    city: DeepPick<Company, 'address.city'>;
};

这里使用Pick工具类型从Company类型中提取name属性。同时,通过DeepPick工具类型提取address.city属性,并将其合并到CompanyInfo类型中。

实现思路

  • 首先实现DeepPick工具类型,它能处理嵌套对象的属性提取。通过对属性路径进行解析,递归地找到嵌套对象中的目标属性类型。
  • 然后利用Pick工具类型从Company类型中获取name属性。
  • 最后将name属性与通过DeepPick获取的address.city属性合并,形成CompanyInfo类型,满足题目要求。