isolatedModules
isolatedModules
は、各ファイルを独立して変換する際に、解釈できないコードがある場合に警告するコンパイラオプションです。
- デフォルト:
false
- 追加されたバージョン: 1.5
isolatedModules
はトランスパイラ向けのオプション
TypeScriptをJavaScriptに変換する際、複数のファイルが関連することがあります。しかし、Babelのようなトランスパイラは、1ファイルずつ処理するため、一部コードが正しく解釈されないことがあります。
具体的には、const enum
やnamespace
などの機能を使用すると、実行時に問題が発生することがあります。isolatedModules
は、このような問題を回避するために、正しく解釈できないコードがある場合に警告します。
isolatedModules
が有効な場合に機能しないコード
以下は、isolatedModules
が有効な場合に機能しないコードの例です。
値でない識別子のエクスポート
TypeScriptでは、インポートした型を再エクスポートすることができます。
これは、複数のモジュールから型や関数をまとめてエクスポートする際に便利です。ただし、isolatedModules
が有効な場合、型を再エクスポートする際にexport type
を使わないとエラーが発生します。
問題のあるコード:
someModule.tsts
export typeSomeType = any;export functionhello () {console .log ("hello");}
someModule.tsts
export typeSomeType = any;export functionhello () {console .log ("hello");}
index.tsts
import { SomeType, hello } from "./someModule";// someTypeは値?それとも型?トランスパイラには判断できないexport { SomeType, hello };
index.tsts
import { SomeType, hello } from "./someModule";// someTypeは値?それとも型?トランスパイラには判断できないexport { SomeType, hello };
解決策:
export type
を使用して型を再エクスポートすることで、エラーを回避できます。
index.tsts
import { SomeType, hello } from "./someModule";export type { SomeType }; // 型だと判定できるexport { hello };
index.tsts
import { SomeType, hello } from "./someModule";export type { SomeType }; // 型だと判定できるexport { hello };
モジュールでないファイル
isolatedModules
が設定されている場合、すべての実装ファイルは モジュールでなければなりません。モジュールとは、import
やexport
の構文を使用していることを意味します。ファイルがモジュールでない場合、エラーが発生します。
問題のあるコード:
index.tsts
functionfn () {}
index.tsts
functionfn () {}
解決策:
ファイルをモジュール化するために、空のexport {}
文を追加します。
index.tsts
functionfn () {}// 空の export文を追加することでモジュール化するexport {};
index.tsts
functionfn () {}// 空の export文を追加することでモジュール化するexport {};
const enum メンバーへの参照
TypeScriptでは、const enum
のメンバーに参照すると、生成されるJavaScriptではその参照が実際の値に置き換えられます。しかし、他のトランスパイラは、メンバー値に関する情報がないため、参照を置き換えることができません。そのため、実行時にエラーが発生します。
問題のあるコード:
index.tsts
declare const enumNumbers {Zero = 0,One = 1,}console .log (Numbers .Zero +Numbers .One );
index.tsts
declare const enumNumbers {Zero = 0,One = 1,}console .log (Numbers .Zero +Numbers .One );
解決策:
const enum
の代わりに、通常のenum
を使用することで、エラーを回避できます。
numbers.tsts
enumNumbers {Zero = 0,One = 1,}// 通常の enum への参照は許可されますconsole .log (Numbers .Zero +Numbers .One );
numbers.tsts
enumNumbers {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』より