TS2538报错:CCCustomer无法作为索引类型 适配for...of规范方案咨询
报错根因
TS2538: Type 'CCCustomer' cannot be used as an index type 由for...of迭代逻辑认知错误导致:
for...in遍历数组时,迭代变量拿到的是数组的索引(数字/字符串类型),可直接作为下标访问数组元素,这也是之前写法能正常运行的原因for...of遍历数组时,迭代变量拿到的是数组本身的元素,不是索引。现有代码里把Customer类型的元素值当作索引传入CustomerList[index],类型不满足索引要求的string/number/symbol类型,直接触发类型报错。
同时for...in遍历数组本身存在缺陷:会遍历原型链上的可枚举属性、返回的索引为字符串类型,这也是SonarQube要求替换为for...of的核心原因。
修复方案
方案1:直接使用迭代拿到的元素(无索引需求时推荐)
不需要额外通过索引取值,直接用for...of返回的元素即可,完全符合SonarQube扫描规则:
let data: Array<Customer>; for (const customer of CustomerList) { // 直接操作customer对象即可,无需再写CustomerList[index] const List: Array<string> = []; // 后续业务逻辑 }
方案2:搭配entries()同时获取索引和元素(需要索引时使用)
如果业务逻辑中必须用到数组索引,调用数组的entries()方法配合for...of,可以同时拿到索引和对应元素,不会触发扫描规则:
let data: Array<Customer>; for (const [index, customer] of CustomerList.entries()) { // index为数字类型的合法索引,customer为对应位置的Customer类型元素 const List: Array<string> = []; // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者sagar
相关产品推荐
相关产品推荐

