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


90

@type/{name}インストールしたNodeJSパッケージの1つに対するTypeScript定義が見つからないため、その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」は、「{プロジェクトパス} \ node_modules \ node-helper-lib \ index.js」にある型指定されていないモジュールに解決されます。これは拡張できません。

ライブラリが型指定されていないので、それに型付けを追加できるようにする必要があるのは正当ではありませんか?

更新:

使ってます:

  • TypeScript:2.1.4
  • Visual Studio Code:1.9.1
  • ノードJS:6.9.4
  • Windows 10 x64

回答:


153

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

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

例:

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

55

何度か試行錯誤augmentationした結果、「同じファイル内のモジュールを他のモジュール宣言と一緒に宣言する」という意味であることがわかりました。

したがって、型指定されていないサードパーティのJavaScriptライブラリの定義ファイルを作成する場合は、そのファイルに1つだけ含める必要がdeclare module 'lib-name'あり、「lib-name」はライブラリ名と完全に一致する必要があります(package.jsonにあります。」名前」プロパティ)。

一方、サードパーティのライブラリにすでに定義ファイルが .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 '...' { ... }

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


1
サードパーティのライブラリにすでに定義ファイル.d.tsが含まれているが、それを無視してカスタムライブラリを使用したい場合はどうすればよいですか?
Alen Liang

24
完全に型指定されていないnpmモジュールの定義ファイルを書き込もうとしていますsupertest— TypeScriptの苦情は意味がありません。宣言さえないものを拡張できないのはどうしてですか?このようなカスタム定義ファイルを何度も書いたと思いました[ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented.@types/supertest
...—

35
@ChaseMoskal:ファイル内で.d.ts、すべてのインポートを宣言モジュール "moduleName" {}に移動する必要があるかもしれません。
パレオ2017

17
@Paleoはまさにそれでした、すべてのimport呼び出しはdeclare module 'module' {}スコープ内に入る必要があります。エラーはせいぜい誤解を招くものです
pocesar 2017

2
importモジュールに必要なステートメントをモジュールdeclare moduleの内部ではなく外部に配置した場合、typescriptは同じことを行います。そのような直感的でない奇妙な振る舞い(ここで暴言を吐いてすみません)。
binki 2018

0

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


-4

私の場合、typesファイルの1つで次の宣言を使用しただけなので、typescript以外のすべてのパッケージを使用できました。

declare module '*'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.