TypeScript:如何将对象类型转换为路径映射类型?
TypeScript 实现嵌套对象到路径映射类型
要实现从嵌套对象类型生成指定的路径映射类型,我们可以通过TypeScript的递归条件类型来完成,以下是具体实现方案:
核心实现代码
// 合并交叉类型为单一对象类型 type Merge<T> = { [K in keyof T]: T[K] }; // 递归生成路径映射类型 type PathsMap<T> = Merge< { [K in keyof T]: // 当前属性的基础路径 { [K]: [K] } & // 递归处理子类型 (T[K] extends Array<infer U> ? PathsMap<U> extends infer PM ? { [SK in keyof PM]: [K, number, ...PM[SK]] } : never : T[K] extends object ? PathsMap<T[K]> extends infer PM ? { [SK in keyof PM]: [K, ...PM[SK]] } : never : never) }[keyof T] >;
用法示例
定义你的嵌套对象类型,然后直接使用PathsMap类型工具:
type NestedObject = { prop1: { prop1_1: string; }; prop2: string; prop3: {prop3_1: string;}[]; }; // 生成目标路径映射类型 type PathsMapFromNestedObject = PathsMap<NestedObject>;
生成的PathsMapFromNestedObject类型与需求完全一致:
type PathsMapFromNestedObject = { prop1: ["prop1"]; prop1_1: ["prop1", "prop1_1"]; prop2: ["prop2"]; prop3: ["prop3"]; prop3_1: ["prop3", number, "prop3_1"]; };
工作原理说明
Merge<T>类型:将多个交叉对象类型(如A & B)合并为一个整洁的单一对象类型,避免最终结果呈现交叉类型的形式。PathsMap<T>递归类型:- 遍历对象的每个属性键
K,首先生成该属性自身的路径条目{ [K]: [K] }。 - 如果属性值是数组类型,则递归处理数组的元素类型,将每个子路径前缀加上当前键和
number(代表数组索引)。 - 如果属性值是普通对象类型,则递归处理该子对象,将每个子路径前缀加上当前键。
- 最后将所有属性对应的路径条目交叉合并,再通过
Merge转换为单一对象类型。
- 遍历对象的每个属性键
内容的提问来源于stack exchange,提问作者Walden Liang
相关产品推荐
相关产品推荐

