无法用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
相关产品推荐
相关产品推荐

