Javascript 如何在Typescript中导出具有其他名称的命名空间
假设我的Typescript代码使用第三方名称空间Javascript 如何在Typescript中导出具有其他名称的命名空间,javascript,typescript,Javascript,Typescript,假设我的Typescript代码使用第三方名称空间Foo 我想在utility.Foo模块中为此模块编写一些实用程序函数 问题是原始的Foo将隐藏到Utility.Foo中定义的函数中 为了解决这个问题,我想写以下内容: 名称空间实用程序{ 名称空间{ 导出功能条(){ 返回Foo.x; } } 出口{u Foo as Foo}; } 它将在ES3中传输到 var效用; (功能(效用){ var_Foo; (功能){ _Foo.bar=函数(){ 返回Foo.x; }; })(_Foo | |
Foo
我想在utility.Foo
模块中为此模块编写一些实用程序函数
问题是原始的Foo
将隐藏到Utility.Foo
中定义的函数中
为了解决这个问题,我想写以下内容:
名称空间实用程序{
名称空间{
导出功能条(){
返回Foo.x;
}
}
出口{u Foo as Foo};
}
它将在ES3中传输到
var效用;
(功能(效用){
var_Foo;
(功能){
_Foo.bar=函数(){
返回Foo.x;
};
})(_Foo | |(_Foo={}));
Utility.Foo=\u-Foo;
})(效用| |(效用={}));
使用上面的代码,我得到了错误
TS1194:命名空间中不允许导出声明
为什么会出现这个错误
实现这一目标的正确方法是什么(如果有的话)
编辑
正如我在中所评论的,如果我将实用程序函数直接定义到utility.Foo
,那么原始的Foo
模块将被有效隐藏
为了理解原因,让我们看一下以下类型脚本代码:
var Foo={x:42};
命名空间实用程序{
导出命名空间Foo{
导出功能条(){
返回Foo.x;
}
}
}
它被传输到ES3,如下所示:
var Foo = { x: 42 };
var Utility;
(function (Utility) {
var Foo;
(function (Foo) {
function bar() {
return Foo.x;
}
Foo.bar = bar;
})(Foo = Utility.Foo || (Utility.Foo = {}));
})(Utility || (Utility = {}));
如果我们看看Utility.Foo模块是如何构建的,我们可以看到从
bar
函数访问的Foo
实际上是Utility.Foo={}
。因此bar
返回未定义的您可以将原始值保存在变量FooOrig
中:
var Foo = { x: 42 };
const FooOrig = Foo;
namespace Utility {
export namespace Foo {
export function bar() {
return FooOrig.x;
}
}
}
您可以将原始值保存在变量FooOrig
中:
var Foo = { x: 42 };
const FooOrig = Foo;
namespace Utility {
export namespace Foo {
export function bar() {
return FooOrig.x;
}
}
}
当我调用Utility.Foo.bar
时,它返回undefined
。在Utility.Foo.bar
中放置断点时,我可以看到Foo
被覆盖。下面是传输JS的一个示例。您可以看到原来的Foo
模块被本地Foo
隐藏,它实际上是Utility.Foo={}
@Antoine,对不起,我认为原来的Foo
也在命名空间Utility
中。我编辑了。谢谢。我会的。:)顺便问一下,你知道为什么我不能使用export{u Foo as Foo}
?语法export{as}
是ES6模块语法的一部分,它不适用于IIFE/名称空间。TypeScript可以在名称空间上实现它,但名称空间不再是最佳实践,因此,我认为我们不应该期望名称空间上有新功能。当我调用Utility.Foo.bar
时,它返回undefined
。在Utility.Foo.bar
中放置断点时,我可以看到Foo
被覆盖。下面是传输JS的一个示例。您可以看到原来的Foo
模块被本地Foo
隐藏,它实际上是Utility.Foo={}
@Antoine,对不起,我认为原来的Foo
也在命名空间Utility
中。我编辑了。谢谢。我会的。:)顺便问一下,你知道为什么我不能使用export{u Foo as Foo}
?语法export{as}
是ES6模块语法的一部分,它不适用于IIFE/名称空间。TypeScript可以在名称空间上实现它,但名称空间不再是最佳实践,因此,我认为我们不应该期望名称空间上有新的特性。