打字稿。如何避免foreach循环中的此错误:"算术运算的左侧必须是'any','数字'或枚举类型"?



这是javascript或typescript foreach的一个非常常见的用法:

myArray = ["a","b","c"]
for(var index in myArray)
    console.log(myArray[index]) 

代码日志:a、b和c

然而,在typescript中,"index"var被认为是一个字符串。当我进行任何计算时,例如索引*2,TS计算机会显示闲置的编译器错误:

for(var index in myArray)
    console.log(index * 2); // TS compiler error.

错误TS2362算术运算的左侧必须为类型"any"、"number"或枚举类型

但在执行(如预期)时记录0,2和4

如何避免或支持此错误?

index是一个字符串。for..in对对象的键进行迭代。恰好数组的键是数字键。尽管如此,它们还是以字符串的形式存储。

看看这个:

var myArray = [1, 2, 3];
for (var index in myArray) {
  console.log(typeof index);
}

同样值得注意的是,不能保证顺序会得到这些密钥。通常它们会以正确的顺序出现,但例如,获得"3", "1", "2"并不是无效的。

相反,只需使用普通的for循环。然后你的索引将是数字,你会确信你正在按顺序遍历数组。

var myArray = [1, 2, 3];
for (var i = 0; i < myArray.length; i++) {
  console.log(typeof i, myArray[i]);
}

您也可以使用forEach运行它。

var myArray = [1, 2, 3];
myArray.forEach(function(val, index) {
  console.log(typeof index, val);
});

考虑到您的"索引"将是一个数字,您可以通过将索引强制转换为数字类型来抑制警告/错误

for(var index in myArray)
    console.log(Number(index) * 2);

或者

for(var index in myArray)
    console.log(parseInt(index) * 2);

它是一个字符串,你可以对它调用parseInt(index, 10)。这是因为对象的索引总是字符串,即使在数组上,数组也有一些额外的行为来处理看起来像整数的键

但是,请注意,对数组进行迭代的方式很容易出错。看见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

注意:对于。。。in不应用于迭代索引顺序很重要的数组。

不能保证元素会按照的顺序迭代

您可以始终强制转换元素以避免错误

console.log(index as number * 2); /

相关内容

最新更新