在我的TypeScript项目中(仅使用内部模块),我想包含现有库的polyfills / extension。对于此示例,我将使用RxJS库,但问题/问题并非特定于此库。
以下代码是我提出的:
module MyModule.Rx {
Rx.Observable.prototype.myExtension = function() { /* ... */ };
}
RxJS定义(.d.ts文件)与代码一起使用和编译。这会导致以下编译器错误:2339 Property 'Observable' does not exist on type 'typeof Rx'
据我所知,这是因为我在Rx
中使用了相同的MyModule.Rx
标识符。将第一行中的命名空间切换到module MyModule.NotRx {
时,一切正常 - 从RxJS .d.ts文件中正确查找Observable
类型。
因此似乎名称MyModule.Rx
和RxJS声明的Rx
名称空间存在冲突。我知道我可以简单地将我的命名空间重命名为MyModule.SomethingElse
,但这看起来有点像黑客。
在Rx
命名空间中拥有MyModue.Rx
的所有polyfill / extensions对我来说似乎是一个自然选择 - 如何以干净的方式完成?
答案 0 :(得分:4)
你做不到。
在TypeScript中使用此代码:
var B = 'test';
module A.B {
// Declare a function
export function fn() {
}
// Tests
console.log(B); // Object { }
A.B.fn(); // valid
B.fn(); // valid
fn(); // valid
}
控制台中显示的消息为:Object { }
而不是test
。看看已编译的代码:
var B = 'test'; // root scope
var A;
(function (A) {
var B; // same name, hide the root scope one
(function (B) {
// Declare a function
function fn() {
}
B.fn = fn;
// Tests
console.log(B); // Object { }
A.B.fn(); // valid
B.fn(); // valid
fn(); // valid
})(B = A.B || (A.B = {}));
})(A || (A = {}));
模块A.B
被转换为两个JavaScript变量A
和B
。我们可以使用它们来访问模块的导出成员:可以从fn
,A.B.fn
和B.fn
访问函数fn
。在模块中,来自根作用域的变量B
被模块的变量B
隐藏。
您无法从名为Rx
的模块访问全局变量Rx
。
答案 1 :(得分:4)
正如Tarh所提到的,如果外部模块被局部变量遮蔽,则无法引用它。我已经给出了答案,这应该是公认的答案。我只是留下一些解决方法:
您已经知道的一种解决方法是将MyModule.Rx
重命名为没有Rx
的内容。另一种方法是使用其他名称捕获Rx
:
import OrigRx = Rx;
module MyModule.Rx {
OrigRx.Observable.prototype.myExtension = function() { /* ... */ };
}
非常相似