Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript中的重复声明_Typescript - Fatal编程技术网

TypeScript中的重复声明

TypeScript中的重复声明,typescript,Typescript,考虑以下代码: var a = []; for (var i in a) /* nothing */; var i : number; i = 9; 如果我编译这个,编译器会抱怨最后一行,说“无法将'number'转换为'string'” 可能for..in循环将i创建为一个字符串,但我希望编译器会抱怨var i:number,而不是等到i=9才抱怨 如果我将vari:number更改为vari:number=8,编译器在到达I=9之前不会抱怨 这是一个bug,还是我遗漏了什么?如果

考虑以下代码:

var a = [];

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

var i : number;

i = 9;
如果我编译这个,编译器会抱怨最后一行,说“无法将'number'转换为'string'”

可能for..in循环将
i
创建为一个字符串,但我希望编译器会抱怨
var i:number
,而不是等到
i=9
才抱怨

如果我将
vari:number
更改为
vari:number=8
,编译器在到达
I=9
之前不会抱怨


这是一个bug,还是我遗漏了什么?

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

var i: string;
它将警告您该行上存在重复的标识符:

var i: number;
当您在for语句中声明
i
时,它不会检测到重复的标识符,也许它应该检测到重复的标识符-因此您最终会出现另一个错误,即当您分配了错误类型的值时


如果您想要重复标识符警告,这是这里的第一个也是最重要的错误,那么您最好将错误记录在

上,因为它不是一个错误,要了解发生了什么,您必须了解JavaScript的行为,尤其是在有关提升的区域。基本上,您上面的代码与以下代码相同:

var a = [],
    i;

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

i = 9;
由于在for语句中首次遇到
i
,因此它的类型将变成字符串
for(键:someVar中的字符串){}

下面是一篇用JavaScript描述提升和作用域的文章:

但这并不能解释为什么编译器没有抱怨
vari:number=8
,至少在版本0.8.2中。我使用的是0.8.3,它没有问题。一定是0.8.3中的新错误。它在0.8.2中为我抱怨,但在0.8.3中不是Wierdly,你可以跟踪
typeof(i)
,它会告诉你“number”,但是如果你尝试
i*10
,你会得到操作中@oz1cz描述的错误。谢谢你,史蒂夫。我按照你的建议做了: