如何在TypeScript中存在名称冲突时寻址内部模块

时间:2015-03-11 12:04:04

标签: module namespaces typescript

在我的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对我来说似乎是一个自然选择 - 如何以干净的方式完成?

2 个答案:

答案 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变量AB。我们可以使用它们来访问模块的导出成员:可以从fnA.B.fnB.fn访问函数fn。在模块中,来自根作用域的变量B被模块的变量B隐藏。

您无法从名为Rx的模块访问全局变量Rx

答案 1 :(得分:4)

正如Tarh所提到的,如果外部模块被局部变量遮蔽,则无法引用它。我已经给出了答案,这应该是公认的答案。我只是留下一些解决方法:

您已经知道的一种解决方法是将MyModule.Rx重命名为没有Rx的内容。另一种方法是使用其他名称捕获Rx

import OrigRx = Rx;
module MyModule.Rx {
    OrigRx.Observable.prototype.myExtension = function() { /* ... */ };
}

这与https://stackoverflow.com/a/29021964/390330

非常相似