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

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方法:

  1. 修正类型声明:
    将keys的类型从Object[]改为string[],同时将eventfilters的类型改为带索引签名的对象数组,可以先自定义匹配配置格式的类型:
// 匹配你的config.json结构的类型定义
type EventFilterItem = {
  Name?: string,
  ID?: string,
  Version: string,
  // 兼容其他未知字符串键
  [key: string]: string | undefined
}
  1. 替换原有代码中的类型声明:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 09:45:03