TypeScriptで「error TS2307: Cannot find module 'resend' or its corresponding type declarations」が発生した。最初に確認すべきこととして最も適切なものはどれか?
解説
正解と要点正解は「resendパッケージがnode_modulesにインストールされているか確認する」です。TS2307は「そのモジュール見つからないんだけど」というエラーで、大半のケースはパッケージが入っていないか、型定義が存在しないかのどちらかです。まずはnpm ls resendでインストール状況を確認するのが最短ルートです。なぜその答えなのかstrictモードを無効にする — strictモードは型チェックの厳格さに関わる設定で、モジュール解決とは別の話です。strictを切ってもモジュールが見つからないエラーは消えません。「TS2307とstrictの違い」で混乱する人がいますが、strictはnull安全性や暗黙anyの検出に関わる設定群です。TypeScriptのバージョンアップ — バージョン起因でTS2307が出ることはほぼありません。モジュール解決の仕組みはバージョン間で大きく変わっていないので、アップグレードで直るケースは稀です。import文をrequireに書き換える — これは根本解決ではなくただの回避策で、しかもTypeScript環境では型情報が失われてany扱いになります。ESMとCommonJSの違いを正しく扱うなら、tsconfig.jsonのmoduleResolution設定を見直す方が適切です。背景・仕組みTypeScriptがimport文を見つけると、モジュール解決(Module Resolution)というプロセスで対象ファイルを探しに行きます。具体的には以下の順序です。node_modules/resendディレクトリ内のpackage.jsonのtypesフィールドnode_modules/resend/index.d.tsnode_modules/@types/resend(DefinitelyTypedの型定義パッケージ)resendはSDK自体にTypeScriptの型定義を同梱しているパッケージなので、npm install resendすれば型も一緒に入ります。逆に言えば、インストールし忘れかnode_modulesが壊れているかのどちらかがこのエラーの典型原因です。よくあるミスとエラー1. node_modulesを消した後にinstallし忘れ# ありがちな流れ rm -rf node_modules # ここでnpm installを忘れてビルドを実行 npx tsc # error TS2307: Cannot find module 'resend'2. モノレポでパッケージが別のワークスペースにあるモノレポ構成でルートにはresendがあるのに、サブパッケージのnode_modulesにはhoistされていない場合にも発生します。この場合はワークスペース設定のnohoistを確認するか、対象パッケージで直接npm install resendします。もう一つ紛らわしいのが「TS2307とTS2305の違い」です。TS2307はモジュール自体が見つからない場合、TS2305はモジュールは見つかったが特定のエクスポートが存在しない場合に出ます。エラー番号を見分けると対処が早くなります。実務での活用例CIでの再現 — ローカルでは動くのにCI(GitHub Actionsなど)でTS2307が出る場合、package-lock.jsonのコミット漏れか、キャッシュされた古いnode_modulesが原因であることが多いです。CIでは毎回クリーンインストールする設定にしておきましょう。# GitHub Actionsでの確実なインストール - run: npm ci型定義が同梱されていないパッケージの場合 — resendは同梱していますが、たとえばexpressなど型が別パッケージになっているものは@types/expressをdevDependenciesに追加する必要があります。# 型定義が別パッケージの場合 npm install express npm install -D @types/expressどうしても型定義がないパッケージ — 型が見つからないなら、プロジェクトにdeclarations.d.tsを作って暫定的に宣言する手もあります。ただしこれは最終手段です。// declarations.d.ts declare module 'some-untyped-lib';