Javascript 如何在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 | |

假设我的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=\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可以在名称空间上实现它,但名称空间不再是最佳实践,因此,我认为我们不应该期望名称空间上有新的特性。