TypeScript中的重复声明

时间:2013-02-28 13:51:16

标签: typescript

考虑以下代码:

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之前仍然不会抱怨。

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

2 个答案:

答案 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