Module 当TypeScript中存在名称冲突时,如何处理内部模块

Module 当TypeScript中存在名称冲突时,如何处理内部模块,module,namespaces,typescript,Module,Namespaces,Typescript,在我的TypeScript项目(仅使用内部模块)中,我希望包含现有库的polyfills/扩展。对于本例,我将使用RxJS库,但问题/问题并不特定于此库 以下代码是我想到的: module MyModule.Rx { Rx.Observable.prototype.myExtension = function() { /* ... */ }; } RxJS定义(.d.ts文件)与代码一起使用和编译。这会导致以下编译器错误:2339属性“Observable”在类型“typeof Rx”

在我的TypeScript项目(仅使用内部模块)中,我希望包含现有库的polyfills/扩展。对于本例,我将使用RxJS库,但问题/问题并不特定于此库

以下代码是我想到的:

module MyModule.Rx {
    Rx.Observable.prototype.myExtension = function() { /* ... */ };
}
RxJS定义(.d.ts文件)与代码一起使用和编译。这会导致以下编译器错误:
2339属性“Observable”在类型“typeof Rx”上不存在。

据我所知,这是因为我在
MyModule.Rx
中使用了相同的
Rx
标识符。将第一行中的名称空间切换到
module MyModule.NotRx{
时,一切正常-从RxJS.d.ts文件中正确查找
Observable
类型

因此,名称
MyModule.Rx
和RxJS声明的
Rx
名称空间似乎存在冲突。我知道我可以简单地将我的名称空间重命名为
MyModule.SomethingElse
,但这似乎有点像黑客

MyModue.Rx
名称空间中为
Rx
提供所有polyfill/扩展对我来说似乎是一个自然的选择-如何以干净的方式实现这一点?

你不能这样做

在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
可以从根sc访问ope被模块的变量
B
隐藏


您无法从名为
Rx

的模块访问全局变量
Rx
,正如Tarh所述,如果外部模块被局部变量遮挡,则无法引用外部模块。我已经给出了他的答案,这应该是可接受的答案。我只留下一些解决方法:

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

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

这非常类似于OrigRx.Observable.prototype…

,不是吗?