IT-Q

import * as express from "express" と書かれていて、express() を呼ぶところで型エラーや実行時エラーになりました。なぜですか。

ES モジュールの仕様では、import * as で取り込んだものは呼び出せないオブジェクトだからです。esModuleInterop を前提に import express from "express" と書きます。

面接官が見ているのはnamespace import と default import の違い、esModuleInterop を理解しているか。

よくある答えと、面談でどう見られるか

  • ESM の仕様では import * as で取り込んだものは呼び出せないオブジェクト。esModuleInterop を前提に import express from "express" と書く
    その通りです。公式も、import * as の結果を関数として呼べてしまうのは仕様に反すると説明しています。
  • express のバージョンが古い
    バージョンの問題ではありません。取り込み方と、CommonJS との相互運用の問題です。
  • @types/express が入っていない
    型が無い場合もエラーになりますが、この症状は取り込み方の問題です。入っていても起きます。
  • express は TypeScript から使えない
    使えます。取り込み方を合わせれば問題ありません。

模範解答

ES モジュールの仕様では、import * as x で取り込んだ x は、モジュールの中身をまとめたオブジェクトで、関数として呼ぶことはできません。ところが express のような CommonJS のライブラリは、モジュール全体が1つの関数です。

以前の TypeScript(esModuleInterop が無効)は、import * as x を require("x") と同じに扱い、呼び出しを許していました。公式は、これが仕様に反していたと説明しています。esModuleInterop を有効にすると、import express from "express" で関数を受け取れるようになり、出力側にも互換のための処理が入ります。

TypeScript 6.0 からは esModuleInterop を false にできなくなりました。import * as で CommonJS の関数を呼んでいる箇所は、default import に直します。

対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。