TypeScriptバージョン:
バージョン2.6.2
検索ワード:
モジュールエクスポート機能、外部モジュール、npmパッケージ、サードパーティモジュールの宣言ファイル
コード
src/testFile.ts
:
import getFieldList = require('graphql-list-fields');
src/@types/graphql-list-fields/index.d.ts
:
// Doing just this below (as suggested by the Typescript Handbook does not work
// and results in the tsc error under **Actual behavior** below
import { GraphQLResolveInfo } from 'graphql';
declare function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
// The code below is what actually works instead of the above
/*
declare module 'graphql-list-fields' {
import { GraphQLResolveInfo } from 'graphql';
function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
}
*/
予想される行動:
エラーなしでコンパイルします。
実際の動作:
tsc
実行中にエラーが発生しました:
src/testFile.ts(1,31): error TS7016: Could not find a declaration file for module 'graphql-list-fields'. '/node_modules/graphql-list-fields/index.js' implicitly has an 'any' type.
Try `npm install @types/graphql-list-fields` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql-list-fields';`
graphql-list-fields
は私が使おうとしているNPMパッケージであり、現在公開されている型宣言はありません。
Typescriptハンドブックの宣言ファイルに関するセクションを読んだ後、モジュラーライブラリの宣言ファイルを書き込もうとしているので、 module-function.d.ts宣言ファイルテンプレートを使用する必要があることがわかりました。 これが私が上記のindex.d.ts
のコードを思いついた方法ですが、コンパイラーはモジュール 'graphql-list-fields'の宣言ファイルがないことについてまだ文句を言います。 試行錯誤の結果、すべての周りにdeclare module 'graphql-list-fields'
を追加しても、コンパイラエラーなしで機能することがわかりました。
tsconfigのドキュメントに記載されているように、 tsconfig.json
に"typeRoots": ["./node_modules/@types", "./src/@types"]
を設定しようとしましたが、 declare module 'graphql-list-fields'
がないと機能しません
"typeRoots"
はグローバルコード用です。 つまり、グローバル名前空間で宣言されているもので、それを含めたい場合です。 これが、 declare module 'graphql-list-fields' {..
機能する理由です。これは、グローバル名前空間でその名前のモジュールを宣言するだけだからです。
モジュールの場合、それらには独自のスコープがあり、必要なのはパスマップピッグだけです。
のような何か:
{
"compilerOptions": {
"target": "es5",
"baseUrl": "./",
"paths": {
"*" : ["src/@t`ypes/*"]
}
}
}`
@mhegazyをクリアしてくれてありがとう。 これがTypeScriptのドキュメントで、おそらく宣言ファイルのセクションで詳しく説明されていれば役立つと思い
TypeRootsは、タイピングとの逆互換性と移行を可能にするために追加したサポートであるため、混乱を避けるために、可能な限りドキュメントから除外するようにしました。
これが宣言ファイルセクションに収まるかどうかわからない。 https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mappingにそれに関するメモがあり
モジュール解決セクション全体について、宣言ファイルセクションにメモを追加できます。
そのセクションを読んで、まだドキュメントが不足している場合はお知らせください
ああなるほど。 ええ、それは私が最初に必要としたページです。 少なくともパスマッピングについて簡単に説明し、 https: //www.typescriptlang.org/docs/handbook/declaration-files/introduction.htmlの下のどこかにそのドキュメントへのリンクがあると便利だと思い
ハウスキーピングの目的でこの問題を自動的にクローズします。 問題ラベルは、現時点では実行できないか、すでに対処されていることを示しています。
以前のコメント@ typescript-botで述べたように、ドキュメントを更新しておくと便利だと思います。
TypeRootsは、タイピングとの逆互換性と移行を可能にするために追加したサポートであるため、混乱を避けるために、可能な限りドキュメントから除外するようにしました。
@mhegazyドキュメントがほとんどまたはまったくないサポートされている機能があると、混乱が生じます。 このような機能を適切に文書化してください。ただし、警告言語は自由に使用してください。 例えば:
_注:この機能は、移行をサポートするための型指定との下位互換性のために提供されています。 詳細については、リリースノート[こちら]を参照してください。_
これは、GitHubの問題やStackExchangeなどをスキャンして情報を取得するよりも_非常に_望ましいでしょう。
Thxクソトン@mhegazy ! :tada: @types
パスエントリが最終的に欠落していたため、非標準のプロジェクトセットアップが機能しました。 私はこれに何日も費やしました。
アプリケーションの開始プロセスを少し遅くしてもかまわない場合は、package.jsonの開始スクリプトにTS_NODE_FILES=true
を追加するだけで、すべてのカスタム宣言ファイルが見つかります。
私は今得ています:
The following changes are being made to your tsconfig.json file:
- compilerOptions.paths must not be set (aliased imports are not supported)
このオプションは削除されています。
@KrzysztofMadejskiは、TS自体ではなく、CRAによって実行されます。
このスレッドは、typerootsは実際には下位互換性のためのものであると述べています。 私はそれを使用して、明確に型指定された型を作成しようとしています。 typerootsなしでこれらの型を適切にテストする他の方法はありますか? dts-gen
を使用して型を生成し、型のルートにtypes
を追加しましたが、まだ運がありません:-(
@Roadersは、 dts-gen
生成された型を使用するための解決策を見つけましたか?
編集: https: //github.com/microsoft/TypeScript/issues/22217#issuecomment-369783776で解決
ここで私が理解していないことの1つは、次のとおりです。
tsconfig.base.json:
"typeRoots": ["node_modules/@types", "types"],
そしてディレクトリ構造:
/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts
nrwl / nxリポジトリでまったく取得されません。 私は万人のものを試すことができますが、私はその移動した場合、 something-else
にフォルダnode_modules/@types
それは魔法のように仕事と拾っ得るでしょう、示唆しているtypeRoots
として絶対に何もしませんnode_modules/@types
は魔法のように処理されます。
typeRootsを非推奨としてマークし、それが奇妙で風変わりな方法で機能すると言うことは、少なくとも私がそれを使おうとするのを止めたでしょう。
必要なたびにローカルタイプを追加することができた唯一の方法は、tsconfig.base.jsonとの戦いに何時間も費やし、上記のmhegazyコメントに出くわすことです。
私はこれに噛まれ続け、 paths
オプションも構成する必要があることを忘れていたので、適切な設定で単純なリポジトリを作成しました。 それが誰かを助けることを願っています。
最も参考になるコメント
@mhegazyドキュメントがほとんどまたはまったくないサポートされている機能があると、混乱が生じます。 このような機能を適切に文書化してください。ただし、警告言語は自由に使用してください。 例えば:
これは、GitHubの問題やStackExchangeなどをスキャンして情報を取得するよりも_非常に_望ましいでしょう。