残念ながら、これらのことは現在十分に文書化されていませんが、機能させることができたとしても、構成を調べて、各部分の動作と、typescriptが入力を処理およびロードする方法にどのように関連するかを理解しましょう。
最初に、受け取ったエラーについて説明します。
error TS2688: Cannot find type definition file for 'lodash'.
このエラーは実際には、インポートや参照、またはtsファイルのどこかにlodashを使用しようとしたことによるものではありません。むしろ、typeRoots
とtypes
プロパティの使い方の誤解から来ているので、それらについてもう少し詳しく見ていきましょう。
事typeRoots:[]
とtypes:[]
性質は、彼らがしていることですしないで任意の宣言(ロードするための汎用的な方法*.d.ts
)ファイルを。
これら2つのプロパティは、NPMパッケージからのタイピング宣言のパッケージ化とロードを可能にする新しいTS 2.0機能に直接関連しています。
これらはNPM形式のフォルダー(つまり、package.jsonまたはindex.d.tsを含むフォルダー)でのみ機能することを理解することは非常に重要です。
のデフォルトtypeRoots
は次のとおりです。
{
"typeRoots" : ["node_modules/@types"]
}
デフォルトでは、これはtypescriptがnode_modules/@types
フォルダーに移動し、そこにあるすべてのサブフォルダーをnpmパッケージとしてロードしようとすることを意味します。
フォルダーにnpmパッケージのような構造がない場合、これが失敗することを理解することが重要です。
これがあなたのケースで起こっていることであり、あなたの最初のエラーの原因です。
typeRootを次のように切り替えました:
{
"typeRoots" : ["./typings"]
}
typescriptですが、今でスキャンすることをこれは意味./typings
のフォルダのサブフォルダをし、それがNPMモジュールとして検出した各サブフォルダをロードしてみてください。
それでは、typeRoots
ポイントするように設定し./typings
たが、まだtypes:[]
プロパティの設定がない場合を考えてみましょう。次のエラーが表示される可能性があります。
error TS2688: Cannot find type definition file for 'custom'.
error TS2688: Cannot find type definition file for 'global'.
これは、tsc
あなたのスキャンされた./typings
フォルダをサブフォルダを見つけるcustom
とglobal
。次に、これらをnpmパッケージタイプタイプとして解釈しようとしていますが、これらのフォルダーがないindex.d.ts
かpackage.json
、フォルダーにあるため、エラーが発生します。
次に、types: ['lodash']
設定するプロパティについて少し話しましょう。これは何をしますか?デフォルトでは、typescript は内にあるすべてのサブフォルダーを読み込みますtypeRoots
。types:
プロパティを指定すると、それらの特定のサブフォルダーのみが読み込まれます。
あなたのケースでは、./typings/lodash
フォルダをロードするように指示していますが、存在しません。これがあなたが得る理由です:
error TS2688: Cannot find type definition file for 'lodash'
それでは、私たちが学んだことを要約しましょう。導入2.0活字体typeRoots
とtypes
にパッケージロード宣言ファイル用のNPMパッケージ。d.ts
npmパッケージ規則に従ってフォルダーに含まれていないカスタムタイプまたは単一のルースファイルがある場合、これらの2つの新しいプロパティは使用したくないものです。Typescript 2.0は、これらがどのように消費されるかを実際には変更しません。多くの標準的な方法の1つで、これらのファイルをコンパイルコンテキストに含める必要があります。
.ts
ファイルに直接含める:
///<reference path="../typings/custom/lodash.d.ts" />
./typings/custom/lodash.d.ts
あなたのfiles: []
財産に含む。
プロパティに含め./typings/index.d.ts
ますfiles: []
(他の型を再帰的に含めます)。
追加./typings/**
あなたへincludes:
うまくいけば、この議論に基づいて、あなたがあなたのtsconfig.json
作ったものに対して行った変更が再び機能する理由を知ることができるでしょう。
編集:
言及し忘れたことの1つはtypeRoots
、types
プロパティはグローバル宣言の自動読み込みにのみ実際に役立つということです。
例えばあなたが
npm install @types/jquery
そして、デフォルトのtsconfigを使用している場合、そのjqueryタイプのパッケージは自動的にロードされ$
、それ///<reference/>
以上の操作を行わなくても、すべてのスクリプトで使用できます。import
このtypeRoots:[]
プロパティは、タイプパッケージが自動的に読み込まれる場所を追加するためのものです。
types:[]
プロパティの主なユースケースは、(空の配列に設定することで)自動ロード動作を無効にすることで、その後、あなただけは、グローバルに含める特定のタイプが一覧表示されます。
さまざまなパッケージからタイプパッケージをロードするもう1つの方法typeRoots
は、新しい///<reference types="jquery" />
ディレクティブを使用することです。のtypes
代わりに注意してくださいpath
。繰り返しますが、これはグローバル宣言ファイル、実行しない一般的なものに対してのみ有効ですimport/export
。
ここで、との混乱を引き起こすものの1つを示しtypeRoots
ます。覚えておいてください、それtypeRoots
はモジュールのグローバルなインクルージョンについてです。しかし、@types/folder
(typeRoots
設定に関係なく)標準のモジュール解決にも関与しています。
具体的には、明示的にモジュールをインポートすると、常にすべてをバイパスし includes
、excludes
、files
、typeRoots
およびtypes
オプション。だからあなたがするとき:
import {MyType} from 'my-module';
上記のプロパティはすべて完全に無視されます。中に関連するプロパティモジュール解像度がありbaseUrl
、paths
およびmoduleResolution
。
基本的には、使用するときにnode
モジュールの解像度を、それはファイル名の検索を開始しますmy-module.ts
、my-module.tsx
、my-module.d.ts
フォルダから始まることはあなたによって指されbaseUrl
た構成。
ファイルが見つからない場合は、という名前のフォルダーmy-module
を検索package.json
し、typings
プロパティを使用してを検索します。内部にプロパティがあるpackage.json
か、またはない場合は、typings
読み込むファイルを指定しindex.ts/tsx/d.ts
て、そのフォルダー内で検索します。
それでもうまくいかない場合は、でnode_modules
始まるフォルダで同じものを検索しますbaseUrl/node_modules
。
また、これらが見つからない場合はbaseUrl/node_modules/@types
、同じものをすべて検索します。
それはまだ何も見つからなかった場合には、親ディレクトリに行き始めると検索しますnode_modules
と、node_modules/@types
そこに。ファイルシステムのルートに到達するまで、ディレクトリに移動し続けます(プロジェクトの外部にノードモジュールを取得する場合でも)。
私が強調したいことの一つは、モジュールの解決はtypeRoots
あなたが設定したものを完全に無視するということです。そのため、を設定した場合typeRoots: ["./my-types"]
、明示的なモジュール解決中には検索されません。これは、アプリケーション全体で使用できるようにするグローバル定義ファイルを配置できるフォルダとしてのみ機能し、インポートまたは参照する必要はありません。
最後に、モジュールの動作をパスマッピング(つまり、paths
プロパティ)でオーバーライドできます。したがって、たとえば、typeRoots
モジュールを解決しようとするときに、カスタムは参照されないことを述べました。ただし、気に入った場合は、この動作を次のように行うことができます。
"paths" :{
"*": ["my-custom-types/*", "*"]
}
これは、左側に一致するすべてのインポートに対して行われます。右側のようにインポートを変更してから、インポートを試みてください(*
右側は最初のインポート文字列を表します。たとえば、インポートする場合:
import {MyType} from 'my-types';
最初に、次のようにインポートを試みます。
import {MyType} from 'my-custom-types/my-types'
そして、見つからなかった場合は、プレフィックスを付けずに再試行します(配列の2番目の項目*
は、最初のインポートを意味します。
したがって、この方法で、追加のフォルダを追加して、カスタム宣言ファイルや.ts
、必要なカスタムモジュールを検索できimport
ます。
特定のモジュールのカスタムマッピングを作成することもできます。
"paths" :{
"*": ["my-types", "some/custom/folder/location/my-awesome-types-file"]
}
これにより、
import {MyType} from 'my-types';
しかし、それらのタイプを some/custom/folder/location/my-awesome-types-file.d.ts
paths
、どのように異なっているinclude
タイピングの目的のために?