打字稿:允许跨多个文件的重复变量?

时间:2017-01-24 13:36:50

标签: typescript

不确定这是否是Typescript(2.1.5)或预期行为中的错误,但如果我有两个文件在同一文件夹中声明相同的块级var:

a.js

let x = 0;

b.js

let x = 1;

...并使用tsc构建它,我得到:

  

a.ts(1,5):错误TS2451:无法重新声明块范围的变量' x'。

     

b.ts(1,5):错误TS2451:无法重新声明块范围的变量' x'。

这应该发生吗?或者,打字稿具有默认'的概念。命名空间,在整个项目中共享?

我原本以为这可能与Declaration Merging有关,但是使用显式命名空间的等价似乎工作正常:

c.js

namespace Test {
    let x = 0;
}

namespace Test {
    let x = 1;
}

1 个答案:

答案 0 :(得分:6)

如果您没有使用模块系统,那么您在全局范围内声明相同的变量x
如果你在模块中声明它们就可以了。

由于编译的原因,你没有收到Test命名空间的任何错误:

var Test;
(function (Test) {
    var x = 0;
})(Test || (Test = {}));
(function (Test) {
    var x = "fefe";
})(Test || (Test = {}));

如您所见,每个变量都在其自己的闭包内声明;变量未声明到命名空间中 如果你这样做:

namespace Test {
    export let x = 0;
}

namespace Test {
    export let x = "fefe";
}

您将得到相同的错误,因为它被编译为:

var Test;
(function (Test) {
    Test.x = 0;
})(Test || (Test = {}));
(function (Test) {
    Test.x = "fefe";
})(Test || (Test = {}));

修改

这是预期的行为,编译器会阻止您无意中覆盖变量 如果要在不同文件中使用全局范围内的相同变量,则可以执行以下操作:

// a.ts
var x = 1;

// b.ts
declare var x: number;
x = 3;