考虑以下代码:
var a = [];
for (var i in a)
/* nothing */;
var i : number;
i = 9;
如果我编译它,编译器会抱怨最后一行,说“无法将'number'转换为'string'”。
推测for..in循环创建i
作为字符串,但我原本希望编译器抱怨var i : number
而不是等到i = 9
之前抱怨。
如果我将var i : number
更改为var i : number = 8
,编译器在到达i = 9
之前仍然不会抱怨。
这是一个错误,还是我错过了什么?
答案 0 :(得分:3)
如果您最初声明了变量,它会警告您预测的位置。例如,如果您将此行放在代码的顶部:
var i: string;
它会警告你行上的重复标识符:
var i: number;
当您在for语句中声明i
时,它不会检测到重复的标识符,也许它应该是 - 因此您最终会得到一个不同的错误,即当您指定错误类型的值时。< / p>
如果你想要重复的标识符警告,这是第一个也是最重要的错误,你最好的办法是在http://typescript.codeplex.com/上记录错误
答案 1 :(得分:0)
这不是一个错误,要了解正在发生的事情,你必须了解JavaScript的行为方式,特别是在提升领域。基本上,上面的代码与:
相同var a = [],
i;
for (i in a)
/* nothing */;
i = 9;
由于在for语句中首次遇到i
,因此其类型正在变为字符串。 for (key: string in someVar) { }
。
这是一篇描述JavaScript中的提升和范围的文章: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting