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

