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

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"];
};

工作原理说明

  1. Merge<T>类型:将多个交叉对象类型(如A & B)合并为一个整洁的单一对象类型,避免最终结果呈现交叉类型的形式。
  2. PathsMap<T>递归类型:
    • 遍历对象的每个属性键K,首先生成该属性自身的路径条目{ [K]: [K] }。
    • 如果属性值是数组类型,则递归处理数组的元素类型,将每个子路径前缀加上当前键和number(代表数组索引)。
    • 如果属性值是普通对象类型,则递归处理该子对象,将每个子路径前缀加上当前键。
    • 最后将所有属性对应的路径条目交叉合并,再通过Merge转换为单一对象类型。

内容的提问来源于stack exchange,提问作者Walden Liang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:54:30