是否存在替代TypeScript类型联合的方案?支持仅部分类型的可选属性
可以实现,以下是通用方案
针对你给出的X和Y类型,我们可以通过TypeScript的映射类型、条件类型组合,构建出符合要求的合并类型。核心思路是:区分两个类型的共同属性和仅单一类型存在的属性,共同属性取联合类型并设为必选,独有属性设为可选。
通用工具类型实现
// 提取两个类型的共同属性键 type CommonKeys<T, U> = keyof T & keyof U; // 提取仅属于T的属性键 type OnlyTKeys<T, U> = Exclude<keyof T, keyof U>; // 提取仅属于U的属性键 type OnlyUKeys<T, U> = Exclude<keyof U, keyof T>; // 核心合并类型 type MergeWithOptionalUnique<T, U> = // 共同属性:必选,类型为两个类型对应属性的联合 { [K in CommonKeys<T, U>]: T[K] | U[K] } & // 仅T的属性:转为可选 Partial<{ [K in OnlyTKeys<T, U>]: T[K] }> & // 仅U的属性:转为可选 Partial<{ [K in OnlyUKeys<T, U>]: U[K] }>; // 辅助类型:展开交叉类型,让结果更直观 type Flatten<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
针对X和Y的实际使用
type X = { id: number, x: number } type Y = { id: string, y: number } // 得到目标类型 type MergedResult = Flatten<MergeWithOptionalUnique<X, Y>>; // MergedResult 等价于:{ id: number | string; x?: number; y?: number }
逻辑说明
- CommonKeys:通过
keyof T & keyof U筛选出两个类型都包含的属性,这类属性保留必选,类型取两个类型对应属性的联合; - OnlyTKeys/OnlyUKeys:通过
Exclude剔除掉对方类型的属性键,得到仅当前类型独有的属性; - Partial:将独有属性转为可选类型;
- Flatten:TypeScript中交叉类型会显示为
A & B & C,用这个辅助类型可以把它展开为扁平的对象类型,结构更清晰。
这个方案是通用的,不管两个输入类型有多少共同或独有属性,都能按照规则完成合并。
内容的提问来源于stack exchange,提问作者Alexey Romanov
相关产品推荐
相关产品推荐

