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

无法用Array.prototype.includes()匹配枚举与类型的TypeScript问题

TypeScript枚举与联合类型使用includes报错问题

我在使用枚举数组的includes方法时遇到类型不兼容错误,尽管枚举和联合类型包含完全相同的取值。示例代码如下:

type TypeStatus = "todo" | "doing" | "done";

enum EnumStatus {
    Todo = "todo",
    Doing = "doing",
    Done = "done"
}

function test(myStatus: TypeStatus) {
    [EnumStatus.Todo, EnumStatus.Doing].includes(myStatus)
}

收到的TypeScript错误提示:

Argument of type 'TypeStatus' is not assignable to parameter of type 'EnumStatus'.
Type '"todo"' is not assignable to type 'EnumStatus'.(2345)


解决方案1:类型断言兼容数组类型

直接将枚举数组断言为联合类型数组,让includes方法接受TypeStatus类型参数:

function test(myStatus: TypeStatus) {
    ([EnumStatus.Todo, EnumStatus.Doing] as TypeStatus[]).includes(myStatus)
}

解决方案2:从枚举提取字符串类型复用

先从枚举中提取对应的字符串字面量类型,再用这个类型约束数组:

type EnumStatusValues = `${EnumStatus}`;
// EnumStatusValues 等价于 "todo" | "doing" | "done",与TypeStatus完全匹配

function test(myStatus: TypeStatus) {
    ([EnumStatus.Todo, EnumStatus.Doing] as EnumStatusValues[]).includes(myStatus)
}

解决方案3:显式声明数组类型

提前声明数组的类型为TypeStatus[],自动兼容参数类型:

function test(myStatus: TypeStatus) {
    const allowedStatuses: TypeStatus[] = [EnumStatus.Todo, EnumStatus.Doing];
    allowedStatuses.includes(myStatus)
}

问题原因

TypeScript中,字符串枚举的成员类型属于枚举自身类型,而非对应的字符串字面量类型。即便枚举值和联合类型的字符串内容完全一致,TypeScript仍会将它们视为不同的类型体系,直接调用includes就会触发类型不兼容错误。通过断言或显式类型声明,可以让TypeScript识别二者的兼容性。

内容的提问来源于stack exchange,提问作者Sheikh Abdullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:12:02