isolatedModules
isolatedModulesは、各ファイルを独立して変換する際に、解釈できないコードがある場合に警告するコンパイラオプションです。
- デフォルト:
false - 追加されたバージョン: 1.5
isolatedModulesはトランスパイラ向けのオプション
TypeScriptをJavaScriptに変換する際、複数のファイルが関連することがあります。しかし、Babelのようなトランスパイラは、1ファイルずつ処理するため、一部コードが正しく解釈されないことがあります。
具体的には、const enumやnamespaceなどの機能を使用すると、実行時に問題が発生することがあります。isolatedModulesは、このような問題を回避するために、正しく解釈できないコードがある場合に警告します。
isolatedModulesが有効な場合に機能しないコード
以下は、isolatedModulesが有効な場合に機能しないコードの例です。
値でない識別子のエクスポート
TypeScriptでは、インポートした型を再エクスポートすることができます。
これは、複数のモジュールから型や関数をまとめてエクスポートする際に便利です。ただし、isolatedModulesが有効な場合、型を再エクスポートする際にexport typeを使わないとエラーが発生します。
問題のあるコード:
someModule.tstsexport typeSomeType = any;export functionhello () {console .log ("hello");}
someModule.tstsexport typeSomeType = any;export functionhello () {console .log ("hello");}
index.tstsimport { SomeType, hello } from "./someModule";// someTypeは値?それとも型?トランスパイラには判断できないexport { SomeType, hello };
index.tstsimport { SomeType, hello } from "./someModule";// someTypeは値?それとも型?トランスパイラには判断できないexport { SomeType, hello };
解決策:
export typeを使用して型を再エクスポートすることで、エラーを回避できます。
index.tstsimport { SomeType, hello } from "./someModule";export type { SomeType }; // 型だと判定できるexport { hello };
index.tstsimport { SomeType, hello } from "./someModule";export type { SomeType }; // 型だと判定できるexport { hello };
モジュールでないファイル
isolatedModules が設定されている場合、すべての実装ファイルは モジュールでなければなりません。モジュールとは、importやexportの構文を使用していることを意味します。ファイルがモジュールでない場合、エラーが発生します。
問題のあるコード:
index.tstsfunctionfn () {}
index.tstsfunctionfn () {}
解決策:
ファイルをモジュール化するために、空のexport {}文を追加します。
index.tstsfunctionfn () {}// 空の export文を追加することでモジュール化するexport {};
index.tstsfunctionfn () {}// 空の export文を追加することでモジュール化するexport {};
const enum メンバーへの参照
TypeScriptでは、const enumのメンバーに参照すると、生成されるJavaScriptではその参照が実際の値に置き換えられます。しかし、他のトランスパイラは、メンバー値に関する情報がないため、参照を置き換えることができません。そのため、実行時にエラーが発生します。
問題のあるコード:
index.tstsdeclare const enumNumbers {Zero = 0,One = 1,}console .log (Numbers .Zero +Numbers .One );
index.tstsdeclare const enumNumbers {Zero = 0,One = 1,}console .log (Numbers .Zero +Numbers .One );
解決策:
const enumの代わりに、通常のenumを使用することで、エラーを回避できます。
numbers.tstsenumNumbers {Zero = 0,One = 1,}// 通常の enum への参照は許可されますconsole .log (Numbers .Zero +Numbers .One );
numbers.tstsenumNumbers {Zero = 0,One = 1,}// 通常の enum への参照は許可されますconsole .log (Numbers .Zero +Numbers .One );
isolatedModulesは、このような問題を回避するためのコンパイラオプションです。
警告を出してくれることにより、コンパイラが正しく解釈できないコードの存在に気がつくことができます。
create-react-appやcreate-next-appで生成されたtsconfig.jsonのisolatedModulesをfalseにしてはいけない
ReactやNext.jsの雛形生成ツールによって作成されたtsconfig.jsonでは、isolatedModulesが有効化されています。これは、ReactやNextが内部でBabelを使用しているためです。isolatedModulesをfalseに変えてしまうとビルドできなくなる可能性があるため、設定を変更しないようにしましょう。
学びをシェアする
✅isolatedModulesはファイル単位での変換を前提に解釈できないコードをチェックする
🚧Babelなどのトランスパイラとの互換性向上のために存在する
👍isolatedModulesは有効にしよう
『サバイバルTypeScript』より