TypeScript: 'index.d.ts' はモジュールではないというエラーを3つの方法で解決する
TypeScript 型宣言ファイル index.d.ts がモジュールではないというエラーについて
TypeScript でサードパーティ製ライブラリを使用する場合、そのライブラリの型情報を提供する .d.ts
ファイルが必要となります。しかし、まれに index.d.ts
ファイルが読み込まれず、以下のエラーが発生することがあります。
TypeScript typings give me "index.d.ts is not a module"
このエラーは、index.d.ts
ファイル自体はモジュールではなく、他の型宣言ファイルへの参照のみを含む場合に発生します。モジュールとしてではなく、単なる宣言ファイルとしてのみ機能するためです。
解決策
このエラーを解決するには、以下の2つの方法があります。
型宣言ファイルを修正する
index.d.ts
ファイルを編集し、参照している型宣言ファイルを直接インポートするように変更します。具体的には、以下の手順を実行します。
index.d.ts
ファイルを開きます。- 参照している型宣言ファイルを直接インポートする宣言を追加します。
- ファイルを保存して、TypeScript コンパイラを再起動します。
例
// index.d.ts
// 以前
declare module 'my-library';
// 修正後
declare module 'my-library' {
import './my-library.interfaces.d.ts'; // 参照している型宣言ファイルをインポート
}
baseUrl コンパイラオプションを使用する
TypeScript コンパイラオプション baseUrl
を使用して、型宣言ファイルのルートディレクトリを指定できます。これにより、コンパイラは index.d.ts
ファイルをモジュールとしてではなく、宣言ファイルとして認識するようになります。
具体的には、以下の手順を実行します。
tsconfig.json
ファイルを開きます。baseUrl
プロパティを追加し、型宣言ファイルのルートディレクトリを指定します。
{
"compilerOptions": {
"baseUrl": "./node_modules/@types" // 型宣言ファイルのルートディレクトリ
}
}
補足
上記以外にも、以下の方法でエラーを回避できる場合があります。
- 最新バージョンの TypeScript およびサードパーティ製ライブラリを使用する。
npm install --save-dev @types/my-library
コマンドを使用して、型宣言ファイルをインストールする。
この例では、my-library
というライブラリの index.d.ts
ファイルを編集し、参照している型宣言ファイルを直接インポートするように変更します。
// index.d.ts
// 以前
declare module 'my-library';
// 修正後
declare module 'my-library' {
import './my-library.interfaces.d.ts'; // 参照している型宣言ファイルをインポート
}
この例では、tsconfig.json
ファイルに baseUrl
コンパイラオプションを追加し、型宣言ファイルのルートディレクトリを指定します。
{
"compilerOptions": {
"baseUrl": "./node_modules/@types" // 型宣言ファイルのルートディレクトリ
}
}
上記のサンプルコードはあくまでも一例であり、状況に応じて変更する必要があります。
TypeScript で index.d.ts ファイルエラーを解決するその他の方法
require を使用する
型宣言ファイルが存在しないライブラリを使用する場合、require
キーワードを使用してライブラリを直接インポートすることができます。この場合、型情報は提供されませんが、コンパイルエラーは回避できます。
const myLibrary = require('my-library');
// 型情報は提供されない
const result = myLibrary.someFunction(someArgument);
型注釈を使用する
型宣言ファイルが存在しないライブラリの関数や変数に対して、手動で型注釈を記述することができます。
function someFunction(argument: string): number {
// ライブラリの関数を使用
const result = myLibrary.someFunction(argument);
// 型注釈を記述
return result;
}
環境変数を使用する
型宣言ファイルの場所を環境変数で設定することができます。これにより、プロジェクトごとに型宣言ファイルの場所を変更しやすくなります。
// .env ファイル
TYPES_DIR=./node_modules/@types
{
"compilerOptions": {
"baseUrl": process.env.TYPES_DIR // 環境変数を使用
}
}
tsconfig.paths
プロパティを使用して、型宣言ファイルへのエイリアスを定義することができます。これにより、型宣言ファイルのインポートパスを短縮することができます。
{
"compilerOptions": {
"paths": {
"@my-library/*": ["./node_modules/my-library/*"] // エイリアスを定義
}
}
}
import { MyInterface } from '@my-library/interfaces'; // エイリアスを使用
注意事項
これらの方法は、あくまでも暫定的な解決策であり、根本的な解決にはなりません。可能であれば、型宣言ファイルが存在するライブラリを使用するか、型宣言ファイルを作成することをお勧めします。
typescript typescript-typings