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

TypeScript遍历enum生成对象数组报索引类型错误如何解决

报错原因

这个错误的核心原因是TypeScript中Object.keys()的默认返回值类型为string[],静态检查阶段TS无法确认返回的每个字符串都属于SwitchEnum的合法键,因此不允许用通用string类型索引枚举类型,最终抛出无对应索引签名的错误。

TS之所以给Object.keys()设默认返回string[]是刻意的安全设计:静态类型检查无法100%保证运行时对象不会被挂载额外属性,因此默认做了最宽松的类型设定。对于枚举这种开发者明确定义、结构固定的类型,我们可以通过类型断言安全收窄类型,不会引入运行时风险。

解决方案

两种常用修复方式,适配不同编码习惯:

方式1:整体收窄keys返回类型(推荐)

直接将Object.keys(SwitchEnum)的返回值断言为枚举键组成的数组,后续map逻辑中的key会自动推导为正确类型,不需要重复写断言:

const listItems: SelectProps[] = (Object.keys(SwitchEnum) as (keyof typeof SwitchEnum)[]).map((key, index) => ({
  id: index,
  value: SwitchEnum[key],
  label: key
}));

方式2:索引时单独做类型断言

如果不想修改keys整体的返回类型,也可以在访问枚举属性时,单独将key断言为枚举的合法键类型:

const listItems: SelectProps[] = Object.keys(SwitchEnum).map((key, index) => ({
  id: index,
  value: SwitchEnum[key as keyof typeof SwitchEnum],
  label: key
}));
补充说明

你当前定义的是纯字符串枚举,不存在数字枚举自带的反向映射问题,Object.keys拿到的键刚好是On、Off两个值,和你预期要展示的label完全匹配,上述写法可以直接使用。修复后SwitchEnum[key]会被推导为SwitchEnum.On | SwitchEnum.Off类型,完全兼容SelectProps中value的类型定义。

内容的提问来源于stack exchange,提问作者Renaud is Not Bill Gates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:33:22