如何在不修改原始类型的前提下合并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
相关产品推荐
相关产品推荐

