2

考虑这段代码:

var a = [];

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

var i : number;

i = 9;

如果我编译它,编译器会抱怨最后一行,说“无法将'数字'转换为'字符串'”。

大概是作为字符串创建的 for..in 循环i,但我希望编译器会抱怨var i : number而不是等到i = 9它抱怨之前。

如果我更改var i : numbervar i : number = 8,编译器在达到i = 9.

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

4

2 回答 2

3

如果您最初声明了变量,它会警告您预测的位置。例如,如果您将此行放在代码的顶部:

var i: string;

它会警告您该行有重复的标识符:

var i: number;

当您在 for 语句中声明时,它不会检测到重复的标识符i,也许它应该检测到 - 所以您最终会遇到不同的错误,即当您分配错误类型的值时。

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

于 2013-02-28T14:10:29.460 回答
0

这不是错误,要了解发生了什么,您必须了解 JavaScript 的行为方式,尤其是在有关提升的区域周围。本质上,您上面的代码与以下代码相同:

var a = [],
    i;

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

i = 9;

由于i在您的 for 语句中第一次遇到,它的类型正在变成一个字符串。for (key: string in someVar) { }.

这是一篇描述 JavaScript 中的提升和作用域的文章:http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

于 2013-02-28T14:11:45.510 回答