MST

星途 面试题库

面试题:TypeScript复杂泛型工具类型递归组合及条件类型处理

假设你有一个嵌套的树形结构接口TreeNode,每个节点包含id、name和children(类型也是TreeNode[])字段。现在需要创建一个泛型工具类型,能够根据传入的一个键名数组,获取树形结构中对应路径的值。例如,传入['parent', 'children', '0', 'name']能获取到指定节点的name值。要求使用递归、条件类型以及其他必要的泛型工具类型来实现这个功能,并详细解释实现思路和关键步骤。
29.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 实现代码
interface TreeNode {
    id: number;
    name: string;
    children: TreeNode[];
}

type GetValueByPath<T, P extends string[]> =
    P extends [infer First, ...infer Rest]
      ? First extends keyof T
            ? Rest extends string[]
                  ? GetValueByPath<T[First], Rest>
                  : never
            : never
      : T;
  1. 实现思路和关键步骤
    • 定义接口:首先定义了TreeNode接口,它包含idnamechildren字段,childrenTreeNode数组类型。
    • 定义泛型工具类型
      • GetValueByPath<T, P extends string[]>:这是我们要定义的泛型工具类型,T代表树形结构的类型(即TreeNode及其子类型),P是一个字符串数组,代表要获取值的路径。
      • 递归和条件类型判断
        • P extends [infer First, ...infer Rest]:使用条件类型来判断P是否至少有一个元素。如果有,将第一个元素提取为First,剩余元素提取为Rest
        • First extends keyof T:判断First是否是T类型的键。如果是,说明路径中的当前键是有效的。
        • Rest extends string[]:再判断Rest是否还是字符串数组,如果是,说明路径还未结束,继续递归调用GetValueByPath<T[First], Rest>,这里T[First]获取当前路径下的值的类型,然后在这个类型上继续根据Rest路径获取值。
        • 如果Rest不是字符串数组,说明路径结束,直接返回T[First]
        • 如果First不是T类型的键,说明路径无效,返回never
        • P为空数组时,说明路径已经遍历完,直接返回T

例如,对于树形结构TreeNode,如果调用GetValueByPath<TreeNode, ['parent', 'children', '0', 'name']>,它会按照路径逐步获取值,最终返回TreeNode结构中对应路径下name的值的类型。