让我们说我的Typescript代码使用第三方命名空间Foo
。
我想在Utility.Foo
模块中为该模块编写一些实用程序函数。
问题是原始Foo
将隐藏在Utility.Foo
内定义的函数中。
为了解决这个问题,我想写下以下内容:
namespace Utility {
namespace _Foo {
export function bar() {
return Foo.x;
}
}
export {_Foo as Foo};
}
它将在ES3中转化为
var Utility;
(function (Utility) {
var _Foo;
(function (_Foo) {
_Foo.bar = function () {
return Foo.x;
};
})(_Foo || (_Foo = {}));
Utility.Foo = _Foo;
})(Utility || (Utility = {}));
使用上面的代码,我收到了错误
TS1194:命名空间中不允许导出声明
为什么我会收到此错误?
实现这一目标的正确方法是什么(如果有的话)?
修改
正如我在Paleo's answer中所评论的那样,如果我将实用程序功能直接定义到Utility.Foo
,原始Foo
模块将被有效隐藏。
要了解原因,请查看以下的Typescript代码:
var Foo = { x : 42 };
namespace Utility {
export namespace Foo {
export function bar() {
return 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模块,我们可以看到Foo
函数可以访问的bar
实际上是Utility.Foo = {}
。因此bar
会返回undefined
。
答案 0 :(得分:0)
您可以将原始值保存在变量FooOrig
中:
var Foo = { x: 42 };
const FooOrig = Foo;
namespace Utility {
export namespace Foo {
export function bar() {
return FooOrig.x;
}
}
}