2013-02-28 63 views
2

考虑以下代码:重复申报打字稿

var a = []; 

for (var i in a) 
    /* nothing */; 

var i : number; 

i = 9; 

如果我编译,编译器抱怨的最后一行,他说:“无法将‘数量’到‘线’”。

想必for..in循环创建i作为一个字符串,但我本来期望编译器抱怨var i : number而不是等到i = 9这抱怨之前。

如果我将var i : number更改为var i : number = 8,编译器仍然不会抱怨,直到达到i = 9

这是一个错误,还是我错过了什么?

回答

3

如果您最初声明了变量,它会在您预测的位置发出警告。例如,如果你放在这条线在你的代码的顶部:

var i: string; 

它会提醒你上线重复的标识符:

var i: number; 

它不会检测当重复的识别码你在for语句中声明了i,或许它应该 - 这样你最终会得到一个不同的错误,那就是当你指定一个错误类型的值时。

如果你想重复的标识警告,这是这里的第一个也是最重要的错误,最好的办法是登录错误上http://typescript.codeplex.com/

+0

谢谢你,史蒂夫。我按照你的建议:http://typescript.codeplex.com/workitem/771 – oz1cz 2013-02-28 14:54:50

0

这是不是一个错误,以了解发生了什么事情,你必须了解JavaScript的行为,特别是有关吊装的区域。从本质上讲,你有上面的代码是一样的:

var a = [], 
    i; 

for (i in a) 
    /* nothing */; 

i = 9; 

由于i在你的声明,其类型正在成为一个字符串第一次遇到。 for (key: string in someVar) { }

下面是描述在JavaScript提升和范围的一篇文章: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

+0

但是这并不能解释为什么编译器不会抱怨'var i:number = 8'。 – oz1cz 2013-02-28 14:44:15

+0

编译器在我执行'var i:number = 8;'时抱怨我,至少在0.8.2版本中。 – 2013-02-28 15:19:19

+0

我使用0.8.3,并没有抱怨。 – oz1cz 2013-02-28 15:55:06