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

Typescript类型实现多嵌套字典合并展开为单层字典的最优方案

实现方案

核心代码

// 提取单个嵌套对象所有顶层属性值的交叉
type FlattenSingleObject<T extends object> = keyof T extends infer K 
  ? K extends keyof T 
    ? T[K] extends object 
      ? T[K] 
      : never 
    : never 
  : never;

// 合并多个嵌套对象的内层属性
type MergedClasses<C extends object[]> = C extends [infer First, ...infer Rest extends object[]]
  ? FlattenSingleObject<First & object> & MergedClasses<Rest>
  : {};

// 可选:将交叉类型展开为直观的单层对象展示,不影响实际类型功能
type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type FinalMergedClasses<C extends object[]> = Expand<MergedClasses<C>>;

测试用例验证

type X = {
  foo: {
    a: "green",
  },
  bar: {
    b: "blue",
  }
}
type Y = {
  extra: {
    c: "orange",
  },
}

// 实际使用
type Result = FinalMergedClasses<[X, Y]>;

最终Result的推导结果为:

{
  a: "green";
  b: "blue";
  c: "orange";
}

完全符合预期需求。

方案优势

  • 不依赖任何不稳定的UnionToArray黑魔法实现,兼容TS4.0及以上所有版本,不会出现推导为never的异常问题
  • 支持任意数量的输入对象,无长度限制
  • 自带类型安全校验:如果不同输入对象的内层属性存在同名冲突,会按交叉类型规则合并,若属性值类型不兼容会自动推导为never提示异常
  • 代码逻辑清晰,体积仅为原有实现的三分之一,便于后续调整维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 12:57:01