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

如何在不修改原始类型的前提下合并TypeScript类型?

解决TypeScript联合类型解构时的属性不存在错误

问题分析

你遇到的问题本质是:联合类型 Or = A | B 的 keyof 操作只会返回两个类型的共有属性(这里只有 role)。你之前定义的 Merge<Obj> 只是遍历 keyof Obj,所以最终生成的类型依然只有 role 属性,自然无法访问 force。

解决方案

需要创建一个能提取联合类型中所有可能属性的工具类型,将每个属性的类型设为该属性在联合成员中的类型联合(对于不存在该属性的成员,类型为 undefined)。

工具类型实现

// 提取联合类型中所有可能的键
type AllKeys<T> = T extends unknown ? keyof T : never;

// 获取联合类型中指定键对应的类型,不存在则返回undefined
type UnionProperty<T, K extends AllKeys<T>> = 
  T extends unknown ? K extends keyof T ? T[K] : undefined : never;

// 将联合类型合并为包含所有属性的单一类型
type MergeUnion<T> = {
  [K in AllKeys<T>]: UnionProperty<T, K>
};

使用方式

将原变量断言为 MergeUnion<Or> 后再解构:

const { role, force } = or as MergeUnion<Or>;

此时 force 的类型为 boolean | undefined,完全符合原联合类型的语义:当 role 为 admin 时 force 可能存在,为 regular 时不存在(即 undefined),同时不会触发类型错误。

简化写法(可选)

如果觉得工具类型太繁琐,也可以直接断言为包含所有属性的交叉类型(本质和上面的工具类型效果一致):

const { role, force } = or as (A & Partial<B>) | (B & Partial<A>);

不过工具类型的写法更通用,适合复用在其他联合类型场景中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:46:05