2016-12-01 47 views
17

CommonJSモジュールとして使用され、エクスポートされないシンプルなTSパッケージがあります。 TSファイルは、同じ名前のJSファイルにコンパイルされ、require('package/option-foo')として使用されます。関連のないファイルで 'ブロックスコープの変数を再宣言できません'

tsconfig.json:

{ 
    "compilerOptions": { 
    "target": "es5" 
    } 
} 

オプション-foo.ts:

declare const GlobalVar: any; 

function baz() {} 

if (GlobalVar.foo) GlobalVar.baz = baz; 

オプション-bar.ts:

declare const GlobalVar: any; 

function baz() {} 

if (GlobalVar.bar) GlobalVar.baz = baz; 

ここで重要な部分は、そのoption-foooption-barですは一緒に使わないです。プロジェクトにはその他の無料のTSファイルがありますが、何にも影響はありません。ちょうど1つのtscでJSに転送する必要があります。 tsc実行すると、それは

はブロックスコープ変数を再宣言することはできませんスロー

'GlobalVar'。

重複機能の実装。

ブロックスコープ変数 'GlobalVar'を再宣言できません。

重複機能の実装。

GlobalVarおよびbazを両方のファイルに含む。

ビルドプロセスやこれら2つのTSファイルの出力を複雑にすることなく、これをどのように扱うことができますか?

+0

このような場合、 'custom-typings.d.ts'ファイルのようなものを用意して、' any'の両方であればそれを宣言するだけです。また、希望の '--module'コンパイルを変更することもできます(AMD/Systemはファイルを個別にスコープすると思います)。 – Seiyria

答えて

32

TL

希望foo.baz、bar.baz前に名前空間名を使用してC#でのとしての機能を呼び出すことができます; DRちょうどexport {}を書きますあなたのファイルの最も外側の範囲にあります。


ファイルがモジュール(および独自のスコープを持っている)、またはスクリプト(として扱われ、他のスクリプトでグローバルスコープを共有する必要があるかどうかについて、セマンティック一義化が必要であるかの時点で)。

ブラウザでこれは簡単です。<script type="module">タグを使用できるようになり、モジュールを使用できるようになります。

JavaScriptを使用する他の場所についてはどうですか?残念ながら、この時点では、その区別をするための標準的な方法はありません。

TypeScriptが問題に取り組むことを決めたのは、モジュールがで、インポートまたはエクスポートが含まれているファイルであることを単純に述べることでした。

ファイルにトップレベルのimportまたはexportの文がない場合、グローバル宣言が互いに干渉する問題が表示されることがあります。

これを回避するには、単純に何もエクスポートしない文をexportにすることができます。言い換えれば、あなたのファイルの最上位にある

export {}; 

のどこかに書き込んでください。

+0

2番目の考えでは、私はこの解決策で終わりました。ありがとう。 – estus

+0

これはこの問題についての最良の説明です。この問題は長い間私を混乱させます。今日、私はついにその理由を見つけました。 – novaline

+0

だから、ランタイムの問題ではなく、迷惑なTSコンパイラです。このようなTSエラーを無視する方法はありますか? –

8

GlobalVar関数はグローバルスペースに公開されており、typescriptは変数とメソッド名がそのまま再宣言されたことを警告します。 2つの関数がグローバル名前空間で宣言されているため、1回だけ宣言する必要があります。 これを行う場合。使用した名前空間

namespace foo{  
    declare const GlobalVar: any; 
    function baz() {} 

} 

namespace bar{ 
declare const GlobalVar: any; 
function baz() {} 
} 

あなたはこのヘルプあなた

関連する問題