tsconfig.json
のesModuleInterop
プロパティは、ES Modulesと他のモジュールシステムを共用する際に使う。なお、"interop"は相互運用という意味の英単語である。
esModuleInteropプロパティ
JavaScriptには、ES Modulesという標準のモジュールシステムがある。ただ、ES Modulesが生まれるまでにNode.jsで発展したいくつかのモジュールシステム(CommonJS、AMD、UMDなど)があり、これらはまだ現役で使われている。というか、ES Modulesに置き換わっている最中という状況だ。
で、JavaScriptコードの諸々の静的チェックを担うTypeScriptには、これらのモジュールシステムの混在をいい感じに吸収するかエラーとして拒絶するかを選べるオプションがある。それがesModuleInterop
である。
デフォルト値の動作
esModuleInterop
がfalse
、あるいは未指定の場合、TypeScriptはCommonJS/AMD/UMDモジュールをES Modulesと同様に扱う。
ただしこれだと、名前空間インポートで関数オブジェクトをインポートできたり、何やらモジュール間の互換がうまくいかない問題(よくわかりませんでした)が発生する。
trueにした時の動作
esModuleInterop
にtrue
を指定すると、TypeScriptは内部でヘルパー関数を生成したりあれやこれやして、モジュール間の互換がうまいこといくようにしてくれる。
ので、基本このプロパティにはtrue
を指定しておくのが無難と言える。
参考資料
TypeScript: TSConfig Reference – Docs on every TSConfig option