TypeScript 6.0 に上げたら、esModuleInterop: false が使えなくなりました。既存のコードで何が起きますか。
6.0 から esModuleInterop と allowSyntheticDefaultImports を false にできません。import * as で CommonJS の関数を呼んでいた箇所は、default import に直します。
面接官が見ているのは🔴 6.0 で相互運用の挙動が常に有効になったことと、影響する書き方を知っているか。
これは「import * as express from "express" と書かれていて、express() を呼ぶところで型エラーや実行時エラーになりました。なぜですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- 相互運用の挙動が常に有効になる。import * as で CommonJS の関数を呼んでいた箇所は default import に直す必要がある
その通りです。公式のリリースノートも、その書き換えを例に挙げています。 - 何も起きない。設定が消えるだけ
true で使っていたなら影響はありません。false に頼っていた書き方は直す必要があります。 - CommonJS のライブラリが使えなくなる
使えます。より安全な相互運用の挙動に統一されるだけです。 - すべての import を require に書き換える必要がある
その必要はありません。default import にすれば足ります。
模範解答
6.0 では、esModuleInterop と allowSyntheticDefaultImports を false にできなくなり、安全な相互運用の挙動が常に有効になりました。
もともと true で使っていたなら、何も変わりません。false に頼っていたコード、つまり import * as express from "express" としてモジュールそのものを関数として呼んでいた箇所は、import express from "express" に直します。公式のリリースノートもこの書き換えを例に挙げています。
公式は、false にしていると CommonJS を ESM から使うときに実行時の不具合につながりやすかった、と理由を説明しています。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。