面试题答案
一键面试- 实现代码:
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;
- 实现思路和关键步骤:
- 定义接口:首先定义了
TreeNode
接口,它包含id
、name
和children
字段,children
是TreeNode
数组类型。 - 定义泛型工具类型:
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
的值的类型。