You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从嵌套对象的键构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:45:33