为什么在typescript声明空间中重新声明变量不是错误?

时间:2014-05-01 07:35:10

标签: typescript

来自打字稿语言规范1.0的第2.3节(声明):

声明在它们所属的声明空间中引入名称。在同一声明空间中使用两个具有相同拼写的名称是错误的。 [...]全局模块和每个外部或内部模块都有变量的声明空间[...]模块中的每个声明(无论是本地声明还是导出声明)都会对这些声明空间中的一个或多个做出贡献。

为什么重新声明变量不是打字稿错误,如下所示:

var myVariable:number = 10;
var myVariable:number = 11;

但是使用不同类型重新声明变量的打字稿错误,如下所示:

var myVariable:string = "ten";
var myVariable:number = 10; // Error

2 个答案:

答案 0 :(得分:2)

这个历史很有趣。规范的5.1节描述了行为:

  

允许在同一声明空间中对同一变量名进行多次声明   每个声明将相同的类型与变量

相关联

规范中的这种语言有点新。在早期版本的TypeScript中, 错误是在同一范围内两次声明变量。在实践中,这非常令人讨厌:

for(var i = 0; i < arr1.length; i++) {
    /* do some stuff */
}
/*  ...do some other stuff ... */
 for(var i = 0; i < arr2.length; i++) {
    /* now work with the other array */
}

请注意i在同一范围内声明两次(请记住,JavaScript中的for块不会引入新范围)。事实证明这是一个巨大的痛苦,因为每次重构代码将循环从一个地方移动到另一个地方时,你必须关心函数体中是否已经存在var i

复杂的烦恼是一个现已删除的功能,警告你在声明之前使用var,所以即使你只是从一个函数的底部移动一个循环到顶部,你会可能会引入使用前声明错误。

无数分钟浪费了添加和删除var个关键字而没有实际效果。

这也有助于解决多个声明文件重新声明相同变量的问题。

答案 1 :(得分:1)

因为变量在JavaScript中被“提升”,所以这两个声明基本上被压缩为一个,位于范围的顶部。重新声明的变量的行为就像您只是设置值一样。它在JavaScript程序的上下文中“有意义”,并且编译器可以认为让它​​编译是安全的。但是,如果你将它声明为一个不同的类型它没有意义,让编译器抱怨它是有用的,因为它可能是一个错误。

此页面更详细地解释了吊装: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting