这是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); /