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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:28:19