如何在Typescript

时间:2016-04-28 15:45:45

标签: javascript typescript

让我们说我的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

1 个答案:

答案 0 :(得分:0)

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

var Foo = { x: 42 };

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