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
相关产品推荐
相关产品推荐

