来自打字稿语言规范1.0的第2.3节(声明):
声明在它们所属的声明空间中引入名称。在同一声明空间中使用两个具有相同拼写的名称是错误的。 [...]全局模块和每个外部或内部模块都有变量的声明空间[...]模块中的每个声明(无论是本地声明还是导出声明)都会对这些声明空间中的一个或多个做出贡献。
为什么重新声明变量不是打字稿错误,如下所示:
var myVariable:number = 10;
var myVariable:number = 11;
但是使用不同类型重新声明变量的打字稿错误,如下所示:
var myVariable:string = "ten";
var myVariable:number = 10; // Error
答案 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