TypeScriptでES6モジュールをインポートすると発生する「...は非モジュールエンティティ」エラー:原因と解決策を徹底解説
TypeScript エラー「...
は非モジュールエンティティであり、この構造を使用してインポートできません」の詳細解説
デフォルトエクスポートがないモジュールのインポート
ES6 構文のインポートでは、デフォルトエクスポートを持つモジュールのみをインポートできます。デフォルトエクスポートがないモジュールをインポートしようとすると、上記のエラーが発生します。
例
// 正しい例
import MyModule from './MyModule';
// エラーが発生する例
import './MyModule'; // デフォルトエクスポートがないモジュール
解決策
- 個々のエクスポートされたメンバーを明示的にインポートします。
- モジュールにデフォルトエクスポートを追加します。
// デフォルトエクスポートを追加
export default function myFunction() { ... }
// 個々のメンバーをインポート
import { myFunction } from './MyModule';
export * を使用するモジュールのインポート
export *
を使用するモジュールを ES6 構文のインポートでインポートすることはできません。
// エラーが発生する例
import * from './MyModule'; // `export *` を使用するモジュール
import { myFunction, myVariable } from './MyModule';
アンビエントモジュールのインポート
宣言のみで実装のないモジュールを アンビエントモジュール と呼びます。アンビエントモジュールは、ES6 構文のインポートでインポートすることはできません。
// エラーが発生する例
import * as MyModule from './MyModule'; // アンビエントモジュール
- 型定義ファイル (.d.ts) を作成して、アンビエントモジュールの型を宣言します。
// 型定義ファイル (MyModule.d.ts)
declare module './MyModule' {
export function myFunction(): void;
export const myVariable: string;
}
// 個々のメンバーをインポート
import { myFunction, myVariable } from './MyModule';
- 型定義ファイルがインストールされていない場合は、エラーが発生する可能性があります。
npm install @types/...
コマンドを使用して、必要な型定義ファイルをインストールしてください。 - 上記以外にも、このエラーが発生する可能性があります。詳細については、TypeScript のドキュメントを参照してください。
// エラーが発生する例
import './MyModule'; // デフォルトエクスポートがないモジュール
解決策 1
// デフォルトエクスポートを追加
export default function myFunction() {
// ...
}
// インポート
import MyModule from './MyModule';
// 個々のメンバーをインポート
import { myFunction, myVariable } from './MyModule';
// エラーが発生する例
import * from './MyModule'; // `export *` を使用するモジュール
// 個々のメンバーをインポート
import { myFunction, myVariable } from './MyModule';
// エラーが発生する例
import * as MyModule from './MyModule'; // アンビエントモジュール
// 個々のメンバーをインポート
import { myFunction, myVariable } from './MyModule';
// 型定義ファイル (MyModule.d.ts)
declare module './MyModule' {
export function myFunction(): void;
export const myVariable: string;
}
// 個々のメンバーをインポート
import { myFunction, myVariable } from './MyModule';
ES6 構文のインポートでローカルエイリアスを使用すると、デフォルトエクスポートがないモジュールでもインポートできます。
// ローカルエイリアスを使用する
import MyModuleAlias from './MyModule';
// MyModuleAlias を使用してデフォルトエクスポートにアクセス
MyModuleAlias();
CommonJS 構文を使用する
CommonJS 構文のインポートを使用すると、ES6 構文のインポートの制限事項を回避できます。
// CommonJS 構文を使用する
const MyModule = require('./MyModule');
// MyModule を使用してデフォルトエクスポートにアクセス
MyModule();
TypeScript コンパイラオプションを変更する
TypeScript コンパイラオプション esModuleInterop
を true
に設定すると、ES6 構文のインポートで CommonJS モジュールをインポートできるようになります。
// tsconfig.json
{
"compilerOptions": {
"esModuleInterop": true
}
}
注意事項
esModuleInterop
オプションを使用すると、予期しない動作が発生する可能性があるため、すべてのプロジェクトで有効にすることはお勧めできません。- ローカルエイリアスと CommonJS 構文を使用する場合は、ES6 構文のインポートよりも互換性が低くなる可能性があることに注意してください。
typescript ecmascript-6 es6-modules