如何从嵌套对象的键构造Union Type联合类型?
从嵌套对象键构造叶子节点路径联合类型
给定如下嵌套对象类型:
type NestedObject = { prop1: { nestedProp1: string; nestedProp2: number; }; prop2: { nestedProp3: boolean; nestedProp4: symbol; }; prop3: string; };
我们需要生成仅包含叶子节点路径的联合类型,即:
type Type = | 'prop1.nestedProp1' | 'prop1.nestedProp2' | 'prop2.nestedProp3' | 'prop2.nestedProp4' | 'prop3';
解决方案
可以通过递归的条件类型实现这个需求:
// 递归提取嵌套对象的叶子节点键路径 type NestedLeafKeyPaths<T> = T extends object ? { [K in keyof T]-?: K extends string | number ? T[K] extends object ? `${K}.${NestedLeafKeyPaths<T[K]>}` : `${K}` : never }[keyof T] : never;
使用示例
将工具类型作用于目标对象类型:
type NestedObject = { prop1: { nestedProp1: string; nestedProp2: number; }; prop2: { nestedProp3: boolean; nestedProp4: symbol; }; prop3: string; }; // 生成目标联合类型 type Type = NestedLeafKeyPaths<NestedObject>;
此时Type会被TypeScript正确解析为期望的联合类型,仅包含所有叶子节点的完整路径。
原理说明
- 通过
T extends object判断当前处理的类型是否为对象,区分原始类型和嵌套对象 - 遍历对象的每个键
K,先确保K是可拼接的字符串/数字类型 - 如果当前键对应的值仍是对象,则递归处理该嵌套对象的路径,并通过模板字符串
${K}.${...}拼接父键与子路径 - 如果当前键对应的值是原始类型,则直接返回该键的字符串形式
- 最后通过
[keyof T]将所有键对应的路径合并为一个联合类型
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

