面试题答案
一键面试实现思路
- 定义递归类型来处理嵌套对象。
- 利用条件类型和索引类型查询来判断和提取属性。
- 对属性路径进行拆分,递归处理每一层路径。
关键代码点
- 类型定义:
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;
- 使用示例:
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
类型递归地根据传入的属性路径提取相应的属性。- 条件类型判断属性路径的每一层,并根据情况提取属性。