2016-04-28 39 views
1

私のTypescriptコードでサードパーティの名前空間Fooを使用しているとします。Typescriptで名前空間を別の名前でエクスポートする方法

Utility.Fooモジュール内に、このモジュール用のユーティリティ関数をいくつか書きたいと思います。

オリジナルのFooは、Utility.Fooの中で定義された関数に隠れてしまうという問題があります。

ことを回避するために、私は以下のような何か書きたい:

namespace Utility { 

    namespace _Foo { 
    export function bar() { 
     return Foo.x; 
    } 
    } 

    export {_Foo as Foo}; 

} 

、それは上記のコードを使用して

var Utility; 
(function (Utility) { 

    var _Foo; 
    (function (_Foo) { 
    _Foo.bar = function() { 
     return Foo.x; 
    }; 
    })(_Foo || (_Foo = {})); 

    Utility.Foo = _Foo; 

})(Utility || (Utility = {})); 

にES3でtranspiledされるだろうが、私はよエラーが発生する

TS1194:エクスポートの宣言は名前空間で許可されていません

なぜこのエラーが発生しますか?

これを達成するための適切な方法は何ですか?私はUtility.Fooに直接私のユーティリティ関数を定義した場合

EDIT

私はPaleo's answerにコメントしたように、オリジナルのFooモジュールを効果的に隠されています。

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

それは、このようES3にtranspiledされています:私たちはUtility.Fooモジュールが内蔵されているかを見れば

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 = {})); 

なぜ、のは、以下の活字体のコードを見てみましょう理解する

bar機能からアクセス可能なFooが実際にはUtility.Foo = {}であることがわかります。したがってbarundefinedを返します。

答えて

0

あなたは、変数FooOrigで元の値を保存することができます:

var Foo = { x: 42 }; 

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

私は 'Utility.Foo.bar'呼び出すと、それは' undefined'を返します。 'Utility.Foo.bar'にブレークポイントを置くと、' Foo'がオーバーライドされていることがわかります。ここでは、蒸留されたJSへの[link](http://pastebin.com/8E75xqii)です。元の 'Foo'モジュールはローカル' Foo'によって隠されていることがわかります。これは 'Utility.Foo = {}'です。 – Antoine

+0

@Antoine、申し訳ありませんが、元の 'Foo'が' Utility'という名前空間にあったのを思い出しました。私は編集しました。 – Paleo

+0

ありがとうございます。 :)ところで、あなたは 'export {_Foo as Foo} 'を使うことができない理由を知っていますか? – Antoine

関連する問題