Module 当TypeScript中存在名称冲突时,如何处理内部模块
在我的TypeScript项目(仅使用内部模块)中,我希望包含现有库的polyfills/扩展。对于本例,我将使用RxJS库,但问题/问题并不特定于此库 以下代码是我想到的: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”
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…
,不是吗?