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

是否存在替代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 }

逻辑说明

  1. CommonKeys:通过keyof T & keyof U筛选出两个类型都包含的属性,这类属性保留必选,类型取两个类型对应属性的联合;
  2. OnlyTKeys/OnlyUKeys:通过Exclude剔除掉对方类型的属性键,得到仅当前类型独有的属性;
  3. Partial:将独有属性转为可选类型;
  4. Flatten:TypeScript中交叉类型会显示为A & B & C,用这个辅助类型可以把它展开为扁平的对象类型,结构更清晰。

这个方案是通用的,不管两个输入类型有多少共同或独有属性,都能按照规则完成合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:03:27