2016-01-06 4 views
5

をインポートしています。活字体のNPMのタイピングはpackage.json <a href="https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages">typings</a>エントリを使用する場合のセマンティクスが変更<code>import x = require('...')</code>パターンを用いてタイピング(<code>.d.ts</code>)ファイルをインポートする際の変更は意味論

は、例えば、次の宣言ファイルのインポートが正常に何 package.json typingsエントリは使用されないが、typingsエントリと を使用エラーTS2656 (Exported external package typings file is not a module)を生成する場合:

declare module 'mymodule' { 
    export function myfunc(source: string): string; 
} 

同一の一方をファイルマイナスdeclare module {} package.json typingsエントリで使用した場合、 TS2307(Cannot find module)を使用した場合、typingsエントリ。

export function myfunc(source: string): string; 

セマンティクスの変更はなぜですか?

新しいNPMのタイピングを使用する場合は には、NPMとあなたのタイピングのファイルの非NPMの両方のバージョンを維持する必要があります備えていますように見えます。私は プロジェクト自体の中にプロジェクトタイピングファイルを使用しようとすると、この中にヒット

(活字体がtypingsエントリの現在のプロジェクトの package.jsonに見ていない、./node_modulesに検索 だ封じ込めるようです)。活字体1.7.5でテスト

答えて

3

the documentationに、typings key in package.jsonは、単一のNode.jsモジュールを指すmainキーのアナログです。このように、d.tstypingsファイルによって指さ単一エクスポートモジュール宣言、ないd.ts束であることが期待あります。

文書によって与えられた具体的な根拠は以下のとおりです。

根拠がタイピングがコンパイルされたファイルのセットにを新たに互換性のあるソースを持ってはならないということです。そうでない場合は、ソースファイル(すなわち.tsファイル)は、ユーザコードの一部として、コンパイラによって考慮され、コンパイルされ、パッケージ内の出力が得られ.js出力で上書きすることができます。

さらに、ロードタイプは、同じライブラリの異なるバージョンの競合する可能性のあるエントリをもたらすことによって、グローバルスコープを汚染してはなりません。モジュールは、独自のスコープを持っており、あなたのタイピングのファイルは、それがユーザーのグローバルスコープを汚染されるモジュールがない場合は、グローバルな名前空間を汚染しない、とあなたのパッケージに依存する他のパッケージとの競合が発生します。同様に/// <references ... />は、グローバルスコープにグローバル宣言をもたらすことができるし、避けるべきです。

は(個人的に、あなたのように、私はこの実装は完全に間違ってと愚かだと思います。typingsキーの場合、は、大量のTypeScript固有のファイルを含むファイルシステムの汚染を回避する手段として、パッケージ全体を記述する複数の相対declare module './foo' { … }宣言を含む1つのファイルを指し示す必要があります。残念ながら、その時点でこの船は航海していますので、あなたのパッケージには、TypeScript特有のd.tsファイルがJavaScriptモジュールと並んでいるだけでなく、メインモジュールの型付けに関するこの重複した記述が必要です。

+0

あなたは私の混乱を解消するために、今は 'typings'キーの使用を避けたいと思いますので、2つの(実質的に同一の)' .d.ts'ファイルを管理する必要はありません。 –

+0

これが質問に答えるなら、私はこれを受け入れられた答えとしてマークすることに感謝します。ありがとう! –

+0

完了、ありがとうございました。 –

関連する問題