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

TypeScript报错TS(7015):索引表达式非number类型致隐式any

解决TypeScript错误:Element implicitly has an 'any' type because index expression is not of type 'number'.ts(7015)

这个错误的根源是Object.keys()返回的是string[]类型,而数组communes的合法索引必须是number类型。TypeScript无法确认遍历到的key是有效的数字索引,因此将communes[key]推断为any类型,触发了类型错误。

下面是几种可行的解决方法:

方案一:直接遍历数组元素(推荐)

数组遍历优先使用forEach直接迭代元素,完全规避索引类型不匹配的问题,代码更简洁:

const communes: ICommune[] = _.filter(wilayasData, (commune) => commune.wilaya_code === wilaya.wilaya_code);
communes.forEach((commune) => {
  commune.commune = commune.commune_name_ascii;
  commune.commune_ar = commune.commune_name;
  commune.daira = commune.daira_name_ascii;
  commune.daira_ar = commune.daira_name;
  delete commune.commune_name_ascii;
  delete commune.commune_name;
  delete commune.daira_name_ascii;
  delete commune.daira_name;
});

方案二:将key转换为数字类型

如果必须保留Object.keys的使用,可以把字符串类型的key转为数字,再进行类型断言:

const communes: ICommune[] = _.filter(wilayasData, (commune) => commune.wilaya_code === wilaya.wilaya_code);
Object.keys(communes).forEach((key) => {
  const index = parseInt(key, 10);
  const commune = communes[index] as ICommune;
  commune.commune = commune.commune_name_ascii;
  commune.commune_ar = commune.commune_name;
  commune.daira = commune.daira_name_ascii;
  commune.daira_ar = commune.daira_name;
  delete commune.commune_name_ascii;
  delete commune.commune_name;
  delete commune.daira_name_ascii;
  delete commune.daira_name;
});

方案三:类型断言确认key为合法索引

通过类型断言告诉TypeScript,Object.keys返回的是数组的合法数字索引:

const communes: ICommune[] = _.filter(wilayasData, (commune) => commune.wilaya_code === wilaya.wilaya_code);
(Object.keys(communes) as Array<keyof typeof communes>).forEach((key) => {
  communes[key].commune = communes[key].commune_name_ascii;
  communes[key].commune_ar = communes[key].commune_name;
  communes[key].daira = communes[key].daira_name_ascii;
  communes[key].daira_ar = communes[key].daira_name;
  delete communes[key].commune_name_ascii;
  delete communes[key].commune_name;
  delete communes[key].daira_name_ascii;
  delete communes[key].daira_name;
});

优先推荐方案一,既符合数组遍历的最佳实践,又彻底解决了类型问题,代码可读性最高。

内容的提问来源于stack exchange,提问作者ExpressReactor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:18:18