【问题标题】:How to export a namespace with another name in Typescript如何在 Typescript 中导出具有另一个名称的命名空间
【发布时间】: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


    【解决方案1】:

    您可以将原始值保存在变量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 的link。可以看到原来的Foo模块被本地的Foo隐藏了,其实就是Utility.Foo = {}
    • @Antoine,对不起,我认为原来的 Foo 也在命名空间 Utility 中。我编辑了。
    • 谢谢,我会这样做的。 :) 对了,你知道我为什么不能用export { _Foo as Foo}吗?
    • 语法 export { as } 是 ES6 模块语法的一部分,它不适用于 IIFE/命名空间。 TypeScript 可以在命名空间上实现它,但命名空间不再是最佳实践,因此,我认为我们不应该期待命名空间上的新功能。
    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 2019-12-17
    • 2022-09-27
    • 2022-08-18
    • 2021-02-26
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多