MST

星途 面试题库

面试题:深度递归实现TypeScript Pick工具类型

假设存在嵌套的接口结构,如interface DeepObject { a: { b: { c: string; d: number; }; e: boolean; }; f: string[]; } 请通过递归方式实现一个类似Pick的工具类型,能够从DeepObject及其嵌套对象中精准挑选出指定的属性路径对应的属性,例如从上述DeepObject中挑选出 'a.b.c' 和 'f' 对应的属性,阐述实现思路及关键代码点。
37.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义递归类型来处理嵌套对象。
  2. 利用条件类型和索引类型查询来判断和提取属性。
  3. 对属性路径进行拆分,递归处理每一层路径。

关键代码点

  1. 类型定义
type Paths<T, P extends string = ''> = T extends object
  ? {
      [K in keyof T]: `${P extends '' ? '' : P}.${K}` | Paths<T[K], `${P extends '' ? '' : P}.${K}`>;
    }[keyof T]
  : P;

type DeepPick<T, K extends Paths<T>> = K extends `${infer Head}.${infer Tail}`
  ? Head extends keyof T
    ? Tail extends keyof T[Head]
      ? { [P in Tail]: T[Head][P] }
      : DeepPick<T[Head], Tail>
    : never
  : K extends keyof T
  ? { [P in K]: T[P] }
  : never;
  1. 使用示例
interface DeepObject {
  a: {
    b: {
      c: string;
      d: number;
    };
    e: boolean;
  };
  f: string[];
}

type Result = DeepPick<DeepObject, 'a.b.c' | 'f'>;
// Result 类型为 { a: { b: { c: string; }; }; f: string[]; }

在上述代码中:

  • Paths 类型用于生成所有可能的属性路径。
  • DeepPick 类型递归地根据传入的属性路径提取相应的属性。
  • 条件类型判断属性路径的每一层,并根据情况提取属性。