【发布时间】:2016-04-28 15:45:44
【问题描述】:
假设我的 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 模块是如何构建的,我们可以看到可以从 bar 函数访问的 Foo 实际上是 Utility.Foo = {}。所以bar 返回undefined。
【问题讨论】:
标签: javascript typescript