IT-Q

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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。