web-dev-qa-db-ja.com

カスタムTypeScript定義ファイルを書き込むときに、エラー「モジュール 'name'は...で型指定されていないモジュールに解決します」が発生する

インストール済みのNodeJSパッケージの1つに対するTypeScript定義@type/{name}が見つからないため、d.tsファイルを作成して{project root}\typingsフォルダーに配置しようとします。これは私が行う方法です:

// My source code: index.ts
import Helper from 'node-helper-lib';


// My definition: \typings\node-helper-lib.d.ts
declare....(something else)

declare module 'node-helper-lib' {
   class Helper { ... }
   export = Helper;
}

ただし、Visual Studio Codeはこのエラーを生成し続け、declare module 'node-helper-lib'の下に赤い線を入れます。

[ts]拡張のモジュール名が無効です。モジュール「node-helper-lib」は、「{project path}\node_modules\node-helper-lib\index.js」にある型指定されていないモジュールに解決されますが、これは拡張できません。

ライブラリが型付けされていないので、それに型付けを追加できるようにする必要があるのは合法ではないでしょうか?

更新:

私は使っている:

  • TypeScript:2.1.4
  • Visual Studioコード:1.9.1
  • ノードJS:6.9.4
  • Windows 10 x64
51
hirikarate

いくつかの試行錯誤の後、augmentationは「同じファイル内のモジュールを他のモジュール宣言で宣言する」ことを意味することがわかりました。

したがって、ntypedサードパーティJavaScriptライブラリの定義ファイルを作成する場合は、1つのdeclare module 'lib-name'、および 'lib-name'はライブラリ名と完全に一致する必要があります(そのpackage.json、 "name"プロパティで見つけることができます)。

一方、サードパーティのライブラリ既に定義ファイルがある.d.tsが含まれており、その機能を拡張したい場合は、作成した別のファイルに追加の定義を配置できます。これはaugmentingと呼ばれます。

例えば:

// These module declarations are in same file, given that each of them already has their own definition file.
declare module 'events' {
   // Extended functionality
}

declare module 'querystring' {
   // Extended functionality        
}

declare module '...' { ... }

誰かが同じ質問をする場合に備えて、ここで発見を残します。そして、私が何かを見逃したら私を修正してください。

33
hirikarate

実際の解決策は、@ hirikarateの回答の@Paleoによるコメントに記載されています。

インポートはモジュール宣言の内部で宣言する必要があります。

例:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}
73
Lee Benson

私もそのエラーメッセージを受け取っていました。私にとっての問題は、モジュール宣言が含まれている既存の型定義ファイルで別のモジュールを宣言しようとしていたことです。新しいモジュール宣言を新しいファイルに移動した後、エラーはなくなりました。

0
G-Wiz

私の場合、タイプファイルの1つで次の宣言を使用したので、すべての非TypeScriptパッケージを使用できました。

declare module '*'
0
Alexey