如何解决TypeScript中两个枚举无重叠的类型比较错误?
问题背景
我使用的框架生成了两个枚举类型:DocumentStatesA 使用小写下标(如 signed),DocumentStatesB 使用大写下标(如 SIGNED),二者对应的枚举值完全相同:
export enum DocumentStatesA { signed = "signed", shared = "shared", sent = "sent", refused = "refused", canceled = "canceled", } export enum DocumentStatesB { SIGNED = "signed", SHARED = "shared", SENT = "sent", REFUSED = "refused", CANCELED = "canceled" }
但当我尝试比较二者对应的枚举值时:
let c:boolean = DocumentStatesA.signed === DocumentStatesB.SIGNED
TypeScript 抛出以下错误:
This comparison appears to be unintentional because the types 'DocumentStatesA' and 'DocumentStatesB' have no overlap.(2367)
请问如何在不触发该错误的前提下完成枚举值的比较?
解决方案
方法1:转换为字符串类型
两个枚举的实际值都是字符串,直接将枚举值转为字符串即可绕过类型检查,且不影响比较结果:
// 转换其中一方 let c: boolean = DocumentStatesA.signed === String(DocumentStatesB.SIGNED); // 双方都转换(更严谨) let d: boolean = String(DocumentStatesA.signed) === String(DocumentStatesB.SIGNED);
方法2:使用类型断言
通过类型断言明确告知 TypeScript,我们要将枚举值视为字符串类型进行比较:
let c: boolean = DocumentStatesA.signed === (DocumentStatesB.SIGNED as string);
方法3:统一枚举类型(推荐)
如果框架允许,尽量合并或复用枚举类型,或者定义公共类型别名统一类型:
// 定义公共类型别名 type DocumentState = DocumentStatesA | DocumentStatesB; // 转为公共类型后再比较 let c: boolean = (DocumentStatesA.signed as DocumentState) === (DocumentStatesB.SIGNED as DocumentState);
如果能修改框架的枚举生成逻辑,直接复用同一个枚举是最优解。
方法4:使用宽松相等(不推荐)
== 会自动进行类型转换从而避免错误,但宽松相等可能引发其他潜在类型问题,仅在明确场景安全时使用:
let c: boolean = DocumentStatesA.signed == DocumentStatesB.SIGNED;
内容的提问来源于stack exchange,提问作者Ilijanovic
相关产品推荐
相关产品推荐

