如何在TypeScript中合并简化复杂交叉类型为单一对象类型?
交叉对象类型合并方案
可行,这种操作在TypeScript里称为交叉类型扁平化或类型简化,可以通过工具类型实现。
通用实现:Simplify工具类型
定义一个工具类型,将交叉对象类型合并为单一对象:
type Simplify<T> = { [K in keyof T]: T[K] }
原理是通过映射类型遍历交叉类型的所有属性,重新整合为一个新对象,TypeScript会自动处理属性合并与可选性标记。
将其应用到你的Result类型:
type Result<S extends Schema> = Simplify<Mandatory<S> & Optional<S>>
更优写法:直接生成合并类型
也可以跳过拆分交叉的步骤,直接在映射类型中处理必填/可选属性,一步得到目标类型:
type Result<S extends Schema> = { [P in keyof S]: S[P]["v"] } & { [P in keyof S as S[P]["required"] extends false ? P : never]?: never } extends infer O ? { [K in keyof O]: O[K] } : never
不过通用Simplify工具类型更易读,且能适配多部分交叉的复杂场景。
效果验证
针对你的userSchema,处理后的Result<S>会直接变为:
{ id: string; email: string; name: string; thumbnail?: string; }
完全符合需求。
内容的提问来源于stack exchange,提问作者user23744972
相关产品推荐
相关产品推荐

