如何在Typescript中导出具有其他名称的命名空间

How to export a namespace with another name in Typescript

本文关键字:其他 命名空间 Typescript      更新时间:2023-09-26

假设我的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的回答中所评论的,如果我将我的实用函数直接定义到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

您可以将原始值保存在变量FooOrig:中

var Foo = { x: 42 };
const FooOrig = Foo;
namespace Utility {
  export namespace Foo {
    export function bar() {
      return FooOrig.x;
    }
  }
}