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

TypeScript中嵌套对象扁平化并保留类型能否实现?

解答

可以实现,TypeScript 4.1及以上版本引入了模板字面量类型与递归条件类型,完全支持定义符合要求的Flattened泛型,可精准推导扁平化后的对象结构类型。


完整类型实现

// 辅助类型:遍历嵌套对象生成所有「路径+对应值类型」的元组联合
type FlattenEntries<T, Path extends string = ""> = T extends Record<string, any>
  ? {
      [K in keyof T & string]: FlattenEntries<
        T[K],
        Path extends "" ? K : `${Path}.${K}`
      >
    }[keyof T & string]
  : [Path, T];

// 最终Flattened类型:将元组联合转换为扁平化后的对象类型
type Flattened<T> = {
  [Entry in FlattenEntries<T> as Entry[0]]: Entry[1];
};

效果验证示例

const nested = {
  a: {
    b: {
      c: {
        d1: "hello",
        d2: 42,
      },
    },
  },
};

// 推导结果完全符合预期:{ "a.b.c.d1": string; "a.b.c.d2": number }
type NestedFlattened = Flattened<typeof nested>;

// 配套函数定义示例
function flatten<T extends Record<string, any>>(nested: T): Flattened<T> {
  // 此处省略JS层面的扁平化逻辑实现
  return {} as Flattened<T>;
}

const flattened = flatten(nested);
// 此时可获得完整类型提示:flattened["a.b.c.d1"]自动推导为string类型,flattened["a.b.c.d2"]自动推导为number类型

适用限制

  • 仅支持TypeScript 4.1及以上版本,更低版本缺少模板字面量类型、递归条件类型、键重映射能力,无法实现该泛型。
  • 上述实现默认只处理键为string类型的对象,如需支持number、symbol类型的键,可对类型逻辑做对应扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:03