TypeScript读取JSON配置时Object不能作为索引类型怎么解决
错误原因
keys变量被错误声明为Object[]类型:Object.keys()固定返回字符串数组,只有string/number/symbol类型可作为对象索引,Object类型不符合索引要求,直接触发Type 'Object' cannot be used as an index type.报错eventfilters被声明为Object[]类型:默认的Object类型没有定义任意属性的索引签名,取值时也会触发类型校验不通过
修复方案
只需要调整变量的类型定义即可,不需要依赖Object.values/Object.entries方法:
- 修正类型声明:
将keys的类型从Object[]改为string[],同时将eventfilters的类型改为带索引签名的对象数组,可以先自定义匹配配置格式的类型:
// 匹配你的config.json结构的类型定义 type EventFilterItem = { Name?: string, ID?: string, Version: string, // 兼容其他未知字符串键 [key: string]: string | undefined }
- 替换原有代码中的类型声明:
let eventfilters: EventFilterItem[] = this.getEventFilters(); let keys: string[]; for (let i: number = 0; i < eventfilters.length; i++) { keys = Object.keys(eventfilters[i]); for (let j: number = 0; j < keys.length; j++) { // 此时keys[j]为合法的string类型索引,不会再报错 if(eventfilters[i][keys[j]] === '待比较的参数值'){ // 执行对应操作 } } }
如果不想单独定义类型,也可以直接用通用的Record类型简化写法:
let eventfilters: Record<string, string>[] = this.getEventFilters(); let keys: string[]; for (let i: number = 0; i < eventfilters.length; i++) { keys = Object.keys(eventfilters[i]); for (let j: number = 0; j < keys.length; j++) { if(eventfilters[i][keys[j]] === '待比较的参数值'){ // 执行对应操作 } } }
补充说明
你在浏览器控制台可以用eventfilters[0][0]拿到值,是因为JS运行时会自动将数字索引转为字符串,TS静态校验阶段不允许这种隐式转换,所以必须显式将索引变量声明为合法的字符串类型。
内容的提问来源于stack exchange,提问作者Ankit Gupta
相关产品推荐
相关产品推荐

