【TypeScript】TS2307の原因と解決方法|Cannot find module or its type declarationを完全解説

TypeScriptで開発中に TS2307 というエラーに遭遇したことはありませんか? Cannot find module 'X' or its corresponding type declarations というメッセージが表示され、コンパイルが通らなくなった経験は、TypeScript開発者なら誰しもあるはずです。

TS2307は「モジュールが見つからないエラー」を意味し、TypeScriptコンパイラが import 文で指定されたモジュール(パッケージ・ファイル)を解決できない ときに発生します。npmパッケージのインストール忘れ、@types の未導入、相対パスの誤り、パスエイリアスの設定ミス、画像やCSSファイルの import、moduleResolution の設定問題、monorepo環境の参照エラーなど、原因は非常に多岐にわたります。

この記事では、TS2307エラーを発生パターン別に徹底分類し、それぞれについて実際のエラーメッセージNGコード/設定原因の解説OKコード/設定(修正例)を掲載します。エラーが出たらこの記事を辞書的に参照すれば、すぐに原因を特定し解決できるはずです。

この記事で学べること

  • TS2307エラーメッセージの読み方2つの形式
  • npmパッケージが見つからないケースの原因と解決方法
  • @types パッケージが必要なケースとインストール方法
  • 相対パス・ファイルインポートでのTS2307と正しいパス指定
  • パスエイリアス(@/〜)の設定方法とトラブルシューティング
  • 画像・CSS・JSONなどの非TSファイルの import 方法
  • moduleResolution の設定と各オプションの違い
  • monorepo・ワークスペース環境でのTS2307対策
  • Next.js・React・Vue.js・Vite などフレームワーク固有の解決方法
  • tsconfig.json の設定チェックリスト
  • 実務でよくあるTS2307パターン10選

前提知識:この記事はTypeScriptの基本的な構文を理解している方を対象としています。型の基本から学びたい方は【TypeScript】型の書き方 完全入門を先にお読みください。

スポンサーリンク
  1. TS2307エラーとは?
    1. エラーメッセージの2つの形式
    2. エラーメッセージの読み方
    3. なぜ TS2307 エラーが発生するのか?
    4. TS2307 の主な原因カテゴリ
  2. npmパッケージが見つからないケース
    1. パッケージ未インストール(npm install 忘れ)
    2. node_modules が壊れている / 削除されている
    3. パッケージ名のタイポ(スペルミス)
    4. package.json の dependencies にない
    5. スコープ付きパッケージ(@scope/package)
    6. サブパスインポートの間違い
  3. @types パッケージが必要なケース
    1. 型定義がないJSパッケージ
    2. @types/xxx のインストール方法
    3. DefinitelyTyped の仕組み
    4. @types のバージョン合わせ
    5. 型定義がないパッケージへの対処法(declare module)
    6. 型定義が同梱されているパッケージの見分け方
  4. 相対パス・ファイルインポートのTS2307
    1. パスの間違い(../ の数、大文字小文字)
    2. 大文字小文字の問題
    3. 拡張子の問題(.ts, .tsx, .js, .jsx)
    4. index.ts の省略ルール
    5. Windows vs Mac/Linux のパス区切り
  5. パスエイリアス(@/〜)でのTS2307
    1. tsconfig.json の paths 設定
    2. baseUrl の設定
    3. webpack / Vite との設定同期
    4. Next.js のパスエイリアス
    5. paths が効かない場合のチェックリスト
  6. 画像・CSS・JSON 等の非TSファイルのTS2307
    1. .png, .jpg, .svg の import
    2. .css, .scss, .module.css の import
    3. .json の import(resolveJsonModule)
    4. カスタム型定義の配置と tsconfig の include
  7. moduleResolution の設定問題
    1. 各設定の違いと使い分け
    2. ESM vs CommonJS の問題
    3. package.json の exports フィールド対応
  8. monorepo・ワークスペースでのTS2307
    1. npm/yarn/pnpm ワークスペース
    2. tsconfig の references(Project References)
    3. pnpm の symlink 問題
  9. フレームワーク固有のTS2307
    1. Next.js
    2. React(JSX設定)
    3. Vue.js(.vue ファイル)
    4. Vite 環境の特殊性
    5. Express / Node.js
  10. tsconfig.json の設定チェックリスト
  11. 実務でよくあるTS2307パターン10選
    1. 1. node_modules 再インストールで解決
    2. 2. IDE のキャッシュクリア(TypeScript サーバー再起動)
    3. 3. tsconfig の include 漏れ
    4. 4. @types パッケージのインストール忘れ
    5. 5. パスエイリアスの設定不備
    6. 6. CI/CD 環境での型エラー
    7. 7. Docker コンテナ内での問題
    8. 8. moduleResolution の設定ミス
    9. 9. 画像・CSS の import
    10. 10. monorepo のパッケージ参照
  12. まとめ
    1. TS2307 解決フローチャート
    2. TS2307 と関連エラーの違い
    3. 関連記事

TS2307エラーとは?

TS2307 は TypeScript コンパイラが出す「モジュール解決エラー」です。import 文や require() で指定したモジュール(npmパッケージ、ローカルファイル、型定義ファイルなど)を、TypeScriptコンパイラが見つけられないときに発生します。

エラーメッセージの2つの形式

TS2307 には2つの形式があります。どちらも TS2307 ですが、メッセージが微妙に異なります。

形式1(最も一般的):

error TS2307: Cannot find module ‘X’ or its corresponding type declarations.

形式2(型定義なし):

error TS2307: Cannot find module ‘X’.

形式1は最も一般的なパターンで、モジュール自体が見つからないか、モジュールは存在するが型定義ファイル(.d.ts)がないケースです。形式2はよりシンプルで、モジュール自体がまったく解決できないケースで表示されます。

エラーメッセージの読み方

TS2307のエラーメッセージは、以下のフォーマットに従っています。具体例で構造を確認しましょう。

エラーメッセージの例
src/index.ts:3:22 - error TS2307: Cannot find module 'lodash' or its corresponding type declarations.

3   import _ from 'lodash';
                      ~~~~~~~~
パーツ 意味
ファイルパス src/index.ts エラーが発生したファイル
行:列 3:22 エラー箇所(3行目の22文字目=モジュール名の位置)
エラーコード TS2307 TypeScriptのエラー番号
モジュール名 'lodash' 見つからないモジュール(import先)
波線(~~~~) ~~~~~~~~ エラー箇所の視覚的表示

なぜ TS2307 エラーが発生するのか?

TypeScriptが import 文を処理するとき、モジュール解決(Module Resolution)と呼ばれるプロセスでモジュールの実体を探します。このプロセスが失敗すると TS2307 が発生します。

モジュール解決の探索順序は、大まかに以下の流れです。

モジュール解決の流れ(簡略版)
import something from 'モジュール名';

// TypeScript の探索順序:
// 1. 相対パス(./xxx, ../xxx)の場合
//    → 指定パスからファイルを探す(.ts, .tsx, .d.ts, /index.ts ...)
// 2. 非相対パス(lodash, react 等)の場合
//    → node_modules/lodash を探す(.ts, .d.ts, package.json の types ...)
//    → node_modules/@types/lodash を探す
//    → 親ディレクトリの node_modules を再帰的に探す
// 3. tsconfig.json の paths にマッチする場合
//    → paths で指定されたパスを探す
// 4. typeRoots で指定されたディレクトリを探す
//
// すべて見つからない → TS2307 エラー!

ポイント:TS2307 が出たときは、「TypeScript がそのモジュールの場所を見つけられなかった」ということです。モジュールが存在しない場合だけでなく、存在していてもTypeScriptの探索パスから外れている場合にも発生します。

TS2307 の主な原因カテゴリ

TS2307 の原因は大きく以下のカテゴリに分類できます。この記事では、各カテゴリを個別のセクションで詳しく解説します。

カテゴリ 典型的なエラー 主な原因
npmパッケージ Cannot find module 'lodash' パッケージ未インストール
@types Cannot find module 'express' or its... 型定義ファイルがない
相対パス Cannot find module './utils' パスの間違い・ファイル不在
パスエイリアス Cannot find module '@/components/Button' paths/baseUrl 設定の不備
非TSファイル Cannot find module './logo.png' 型宣言ファイルの未作成
moduleResolution パッケージによって異なる tsconfig の設定が不適切
monorepo Cannot find module '@myorg/shared' ワークスペース設定の問題
フレームワーク固有 Cannot find module 'next/image' フレームワーク型定義の不足

それでは、各カテゴリを順番に見ていきましょう。

npmパッケージが見つからないケース

TS2307 の最も基本的な原因は、import しようとしている npm パッケージがインストールされていないことです。このセクションでは、npm パッケージに起因する TS2307 を網羅的に解説します。

パッケージ未インストール(npm install 忘れ)

最も多い原因です。サンプルコードやチュートリアルをコピーしたときに、パッケージのインストールを忘れるとこのエラーが発生します。

error TS2307: Cannot find module ‘axios’ or its corresponding type declarations.

NGコード
// axios をインストールしていないのに import している
import axios from 'axios';  // TS2307!

const fetchData = async () => {
  const response = await axios.get('https://api.example.com/data');
  return response.data;
};
解決方法: パッケージをインストール
# npm の場合
npm install axios

# yarn の場合
yarn add axios

# pnpm の場合
pnpm add axios

ポイント:axios のように TypeScript の型定義が同梱されているパッケージは、パッケージ自体をインストールするだけで TS2307 が解決します。

node_modules が壊れている / 削除されている

パッケージはインストール済みのはずなのに TS2307 が出る場合、node_modules ディレクトリが壊れている可能性があります。

error TS2307: Cannot find module ‘react’ or its corresponding type declarations.

以下の状況で node_modules の問題が発生しやすくなります。

状況 原因
Git clone 直後 node_modules.gitignore に含まれるため clone 後は存在しない
ブランチ切り替え後 ブランチ間で依存関係が異なり整合性を失う
npm install の途中で失敗 パッケージが不完全にインストールされた状態
lockfile の不整合 package-lock.jsonnode_modules が一致しない
ディスク容量不足 インストール時にファイルが書き込めなかった
解決方法: node_modules を再インストール
# node_modules と lockfile を削除して再インストール
rm -rf node_modules package-lock.json
npm install

# yarn の場合
rm -rf node_modules yarn.lock
yarn install

# pnpm の場合
rm -rf node_modules pnpm-lock.yaml
pnpm install

注意:lockfile を削除すると依存関係のバージョンが変わる可能性があります。まずは node_modules だけ削除して npm ci を試すのがおすすめです。

より安全な方法: npm ci を使用
# lockfile はそのまま、node_modules だけ再構築
rm -rf node_modules
npm ci

パッケージ名のタイポ(スペルミス)

import 文のパッケージ名を間違えている場合も TS2307 が発生します。

error TS2307: Cannot find module ‘lodahs’ or its corresponding type declarations.

NGコード: パッケージ名のタイポ
// よくあるタイポの例
import _ from 'lodahs';        // ✗ lodash のタイポ
import React from 'raect';    // ✗ react のタイポ
import express from 'expresss'; // ✗ express のタイポ
OKコード: 正しいパッケージ名
import _ from 'lodash';        // ✓
import React from 'react';    // ✓
import express from 'express'; // ✓

特に紛らわしいパッケージ名の一覧です。

よくある間違い 正しい名前 備考
date-fns vs datefns date-fns ハイフンあり
class-names vs classnames classnames ハイフンなし
uuidv4 uuid v4 は関数名
styled-component styled-components 末尾の s
node-fetch vs nodefetch node-fetch ハイフンあり

package.json の dependencies にない

グローバルインストールしたパッケージは現在のプロジェクトからは見つかりません。package.json に記載されていることを確認しましょう。

確認コマンド
# パッケージがインストールされているか確認
npm ls axios

# 出力例(インストール済み)
my-project@1.0.0
└── axios@1.6.2

スコープ付きパッケージ(@scope/package)

スコープ付きパッケージは、スコープ名まで含めて正確に指定する必要があります。

error TS2307: Cannot find module ‘tanstack/react-query’ or its corresponding type declarations.

NGコード: スコープの @ を忘れている
import { useQuery } from 'tanstack/react-query';  // TS2307!
OKコード: 正しいスコープ名
import { useQuery } from '@tanstack/react-query';  // ✓
パッケージ 正しい import
@tanstack/react-query import { useQuery } from '@tanstack/react-query'
@reduxjs/toolkit import { configureStore } from '@reduxjs/toolkit'
@emotion/react import { css } from '@emotion/react'
@nestjs/common import { Controller } from '@nestjs/common'
@prisma/client import { PrismaClient } from '@prisma/client'

サブパスインポートの間違い

パッケージのサブパスから import する場合、パスが正確でないと TS2307 が発生します。

NGコード: サブパスの間違い
import deepClone from 'lodash/deepClone';  // TS2307!
import { getAuth } from 'firebase/authentication';  // TS2307!
OKコード: 正しいサブパス
import cloneDeep from 'lodash/cloneDeep';  // ✓
import { getAuth } from 'firebase/auth';  // ✓

ポイント:サブパスのインポートがうまくいかない場合は、node_modules/パッケージ名/ ディレクトリの構造を直接確認するか、公式ドキュメントで正しいインポートパスを確認しましょう。

@types パッケージが必要なケース

JavaScript で書かれた npm パッケージの中には、TypeScript の型定義が同梱されていないものがあります。そのようなパッケージを TypeScript プロジェクトで使おうとすると TS2307 が発生します。DefinitelyTyped が提供する @types/パッケージ名 をインストールすることで解決できます。

型定義がないJSパッケージ

パッケージ自体はインストール済みなのに TS2307 が出る場合、型定義が含まれていない可能性が高いです。

error TS2307: Cannot find module ‘express’ or its corresponding type declarations.

NGコード: 型定義のないパッケージ
// express はインストール済みだが型定義が同梱されていない
import express from 'express';  // TS2307!

const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});
解決方法: @types パッケージをインストール
# express の型定義をインストール
npm install --save-dev @types/express

# yarn の場合
yarn add -D @types/express

# pnpm の場合
pnpm add -D @types/express

@types/xxx のインストール方法

@types パッケージの命名規則は以下のとおりです。

元のパッケージ @types パッケージ インストールコマンド
express @types/express npm i -D @types/express
lodash @types/lodash npm i -D @types/lodash
node @types/node npm i -D @types/node
react @types/react npm i -D @types/react
react-dom @types/react-dom npm i -D @types/react-dom
jquery @types/jquery npm i -D @types/jquery
cors @types/cors npm i -D @types/cors
morgan @types/morgan npm i -D @types/morgan

ポイント:@types パッケージは --save-dev-D)で devDependencies に入れるのが一般的です。型定義は開発時にのみ必要で、本番ビルドには含まれないためです。

DefinitelyTyped の仕組み

DefinitelyTyped は TypeScript の型定義ファイルを集約するオープンソースプロジェクトです。@types/xxx パッケージはこのプロジェクトから npm に公開されています。

型定義の検索方法
# npm で @types パッケージを検索
npm search @types/パッケージ名

# ブラウザで検索
# https://www.npmjs.com/package/@types/パッケージ名
# https://microsoft.github.io/TypeSearch/

@types のバージョン合わせ

@types パッケージのバージョンは元のパッケージのバージョンに対応しています。バージョンが大きく異なると型定義とパッケージの実態が合わず別のエラーが発生する場合があります。

バージョンの対応例
// package.json
{
  "dependencies": {
    "react": "^18.2.0"   // React 18.x
  },
  "devDependencies": {
    "@types/react": "^18.2.0"  // @types も 18.x に合わせる
  }
}

型定義がないパッケージへの対処法(declare module)

すべてのパッケージに @types が用意されているわけではありません。@types がない場合は自分で型宣言ファイル(.d.ts)を作成します。

error TS2307: Cannot find module ‘obscure-library’ or its corresponding type declarations.

解決方法1: declare module で型を宣言(最小限)
// src/types/obscure-library.d.ts
declare module 'obscure-library';

// これだけで TS2307 は解消する
// ただし、すべての export が any 型になる
解決方法2: declare module で型を詳細に定義
// src/types/obscure-library.d.ts
declare module 'obscure-library' {
  export function doSomething(input: string): string;
  export function calculate(a: number, b: number): number;
  export default class ObscureLib {
    constructor(options?: Record<string, unknown>);
    init(): void;
  }
}

注意:typeRoots を指定する場合は ./node_modules/@types も含めてください。指定しないとデフォルトの @types が読み込まれなくなります。

型定義が同梱されているパッケージの見分け方

代表的なパッケージの型定義の状況を一覧にまとめます。

パッケージ 型定義 対応方法
axios 同梱済み npm install axios だけでOK
zod 同梱済み npm install zod だけでOK
date-fns 同梱済み npm install date-fns だけでOK
express 未同梱 npm i -D @types/express が必要
lodash 未同梱 npm i -D @types/lodash が必要
react 未同梱 npm i -D @types/react が必要
cors 未同梱 npm i -D @types/cors が必要

相対パス・ファイルインポートのTS2307

自分で作成したファイルを import するとき、相対パスの指定を間違えると TS2307 が発生します。ファイルシステム上のパスが問題になるケースです。

パスの間違い(../ の数、大文字小文字)

最も基本的なミスは、相対パスの階層の深さを間違えることです。

プロジェクト構造の例
src/
├── components/
│   ├── Button.ts
│   └── Header/
│       └── index.ts
├── utils/
│   └── helpers.ts
└── pages/
    └── Home.ts

error TS2307: Cannot find module ‘./utils/helpers’ or its corresponding type declarations.

NGコード: パスの階層を間違えている
// src/pages/Home.ts から utils/helpers.ts をインポート

// NG: ./ は同じディレクトリ(pages/)を指す
import { formatDate } from './utils/helpers';  // TS2307!
OKコード: 正しい相対パス
// src/pages/Home.ts → src/utils/helpers.ts
import { formatDate } from '../utils/helpers';  // ✓

// src/components/Header/index.ts → src/utils/helpers.ts
import { formatDate } from '../../utils/helpers';  // ✓

大文字小文字の問題

Mac や Windows ではファイル名の大文字小文字を区別しないことが多いですが、Linux(CI/CDサーバーや Docker)では区別されます。ローカルでは動くのに CI で TS2307 が出る場合、大文字小文字が原因の可能性が高いです。

NGコード: 大文字小文字が不一致
// ファイル名: src/components/Button.ts
import { Button } from './Components/button';  // TS2307 (Linux)
OKコード: 完全に一致
import { Button } from './components/Button';  // ✓

拡張子の問題(.ts, .tsx, .js, .jsx)

TypeScript の import ではデフォルトで拡張子を省略します。しかし設定によっては拡張子の扱いが問題になります。

moduleResolution .ts 拡張子 備考
node 省略必須 .ts を付けるとエラーになる場合がある
node16 / nodenext .js で指定 ESM では出力後の .js 拡張子を付ける
bundler 省略可 バンドラーが解決するため柔軟
ESM(node16/nodenext)での拡張子
// NG: 拡張子なし
import { formatDate } from './utils/helpers';  // TS2307!

// OK: .js 拡張子を付ける(出力ファイルの拡張子)
import { formatDate } from './utils/helpers.js';  // ✓

// ※ ソースは .ts だが import パスには .js を書く

index.ts の省略ルール

ディレクトリ内に index.ts がある場合、ファイル名を省略してディレクトリ名だけで import できます。

index.ts の省略
// ファイル: src/components/Button/index.ts

// OK: index.ts は省略できる
import { Button } from './components/Button';  // ✓

// OK: 明示的に指定してもOK
import { Button } from './components/Button/index';  // ✓

注意:moduleResolution: "node16""nodenext" では index.ts の省略が効かない場合があります。ESM モードでは明示的に ./components/Button/index.js と指定する必要があります。

Windows vs Mac/Linux のパス区切り

TypeScript の import では常にスラッシュ(/を使います。Windows のバックスラッシュは使えません。

パス区切り
// NG: Windows のバックスラッシュ
import { Button } from '.\components\Button';  // TS2307!

// OK: 常にスラッシュを使う
import { Button } from './components/Button';  // ✓

パスエイリアス(@/〜)でのTS2307

@/components/Button のようなパスエイリアスは、深いネストの相対パス(../../../)を避けるために広く使われています。しかし、設定が正しくないと TS2307 が発生します。

tsconfig.json の paths 設定

パスエイリアスを使うには tsconfig.jsoncompilerOptions.paths を設定する必要があります。

error TS2307: Cannot find module ‘@/components/Button’ or its corresponding type declarations.

NGコード: paths 未設定
// tsconfig.json に paths が設定されていない
import { Button } from '@/components/Button';  // TS2307!
OKコード: tsconfig.json に paths を設定
// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

ポイント:paths を使うには baseUrl も必ず設定する必要があります。baseUrl はパスの起点となるディレクトリです。

baseUrl の設定

baseUrl は paths の起点ディレクトリを指定します。プロジェクトルートに tsconfig.json がある場合、通常は "." を設定します。

baseUrl の設定例
// プロジェクト構造
// project-root/
//   tsconfig.json
//   src/
//     components/
//       Button.ts

// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",  // project-root が起点
    "paths": {
      "@/*": ["src/*"]  // @/ → project-root/src/
    }
  }
}

webpack / Vite との設定同期

TypeScript の paths はコンパイラの型チェックにのみ使われます。実際のバンドル時には webpack や Vite 側でも同じエイリアスを設定する必要があります。

webpack の resolve.alias
// webpack.config.js
const path = require('path');

module.exports = {
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
};
Vite の resolve.alias
// vite.config.ts
import { defineConfig } from 'vite';
import path from 'path';

export default defineConfig({
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
});

Next.js のパスエイリアス

Next.js では tsconfig.json の paths がそのままバンドル時にも反映されるため、webpack 側の設定は不要です。

Next.js の tsconfig.json
// tsconfig.json(Next.js プロジェクト)
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"],
      "@components/*": ["./src/components/*"],
      "@lib/*": ["./src/lib/*"]
    }
  }
}

paths が効かない場合のチェックリスト

paths を設定したのに TS2307 が解消しない場合、以下を確認してください。

チェック項目 確認内容
baseUrl が設定されているか pathsbaseUrl なしでは動作しない
paths のパターンが正しいか @/** はワイルドカード。配列で複数指定可能
include にファイルが含まれるか includesrc/**/* が含まれているか確認
バンドラー側の設定 webpack / Vite 側でも同じエイリアスを設定する必要がある
IDE の再起動 tsconfig.json 変更後は TypeScript サーバーの再起動が必要な場合がある
tsconfig の継承 extends を使っている場合、paths が上書きされていないか確認

画像・CSS・JSON 等の非TSファイルのTS2307

TypeScript は .ts.tsx ファイル以外(画像、CSS、JSON など)を import しようとすると、デフォルトではモジュールとして認識できず TS2307 が発生します。

.png, .jpg, .svg の import

React プロジェクトなどで画像ファイルを import するケースです。

error TS2307: Cannot find module ‘./logo.png’ or its corresponding type declarations.

NGコード: 画像ファイルの import
import logo from './logo.png';  // TS2307!
import icon from './icon.svg';  // TS2307!
解決方法: 型宣言ファイルを作成
// src/types/images.d.ts
declare module '*.png' {
  const value: string;
  export default value;
}

declare module '*.jpg' {
  const value: string;
  export default value;
}

declare module '*.jpeg' {
  const value: string;
  export default value;
}

declare module '*.gif' {
  const value: string;
  export default value;
}

declare module '*.svg' {
  const value: string;
  export default value;
}

.css, .scss, .module.css の import

CSS ファイルや CSS Modules を import する場合も型宣言が必要です。

error TS2307: Cannot find module ‘./styles.module.css’ or its corresponding type declarations.

解決方法: CSS の型宣言
// src/types/css.d.ts
declare module '*.css' {
  const content: Record<string, string>;
  export default content;
}

declare module '*.scss' {
  const content: Record<string, string>;
  export default content;
}

declare module '*.module.css' {
  const classes: Record<string, string>;
  export default classes;
}

.json の import(resolveJsonModule)

JSON ファイルの import は tsconfig.jsonresolveJsonModule を有効にすることで解決できます。

error TS2307: Cannot find module ‘./data.json’.

解決方法: resolveJsonModule を有効化
// tsconfig.json
{
  "compilerOptions": {
    "resolveJsonModule": true,
    "esModuleInterop": true  // 一緒に有効にするのが推奨
  }
}
JSON import の使い方
// data.json が自動的に型付きで import される
import data from './data.json';  // ✓

// data の型は JSON の内容から自動推論される
console.log(data.name);  // 型安全

カスタム型定義の配置と tsconfig の include

型宣言ファイル(.d.ts)を作成しても、tsconfig.jsoninclude に含まれていなければ効果がありません。

tsconfig.json の include 設定
// tsconfig.json
{
  "compilerOptions": { ... },
  "include": [
    "src/**/*"  // src/ 以下のすべてのファイル(.d.ts 含む)
  ]
}

注意:型宣言ファイルが src/ の外にある場合は、include にそのパスも追加してください。例: "include": ["src/**/*", "types/**/*"]

moduleResolution の設定問題

moduleResolution は TypeScript がモジュールを解決する戦略を決定する重要な設定です。この設定が環境に合っていないと、正しくインストールされたパッケージでも TS2307 が発生します。

各設定の違いと使い分け

TypeScript 5.x では主に4つの moduleResolution 戦略があります。

設定値 対象環境 特徴
node(classic node) CommonJS(従来型) Node.js の require() と同じ解決戦略。最も互換性が高い
node16 Node.js 16+ ESM + CJS 両対応。package.json の exports を参照
nodenext Node.js 最新 node16 とほぼ同じ。将来の Node.js 変更に追従
bundler webpack / Vite 等 バンドラー向け。最も柔軟な解決戦略
tsconfig.json での設定例
// フロントエンド(webpack / Vite)向け
{
  "compilerOptions": {
    "moduleResolution": "bundler"
  }
}

// Node.js(ESM)向け
{
  "compilerOptions": {
    "moduleResolution": "node16",
    "module": "node16"
  }
}

// 従来の Node.js(CommonJS)向け
{
  "compilerOptions": {
    "moduleResolution": "node"
  }
}

ESM vs CommonJS の問題

ESM(ECMAScript Modules)と CommonJS の違いが TS2307 の原因になることがあります。

ESM でのインポート(node16/nodenext)
// ESM では拡張子が必須
import { helper } from './utils/helper.js';  // ✓ .js 必須

// ESM では拡張子なしはエラー
import { helper } from './utils/helper';  // TS2307!

package.json の exports フィールド対応

node16 / nodenext / bundler では、パッケージの package.jsonexports フィールドが優先されます。exports に定義されていないサブパスは import できません。

exports フィールドによる制限
// パッケージの package.json
{
  "name": "some-package",
  "exports": {
    ".": "./dist/index.js",
    "./utils": "./dist/utils.js"
    // ./internal は公開されていない
  }
}

// OK: exports に定義されているパス
import { something } from 'some-package';  // ✓
import { util } from 'some-package/utils';  // ✓

// NG: exports に定義されていないパス
import { internal } from 'some-package/internal';  // TS2307!

ポイント:moduleResolution: "node"(従来型)では exports フィールドを無視するため、同じ import が通ります。node16 / nodenext に切り替えたときに TS2307 が増えた場合は、この exports の問題を疑ってください。

monorepo・ワークスペースでのTS2307

monorepo(モノレポ)環境では、複数のパッケージが1つのリポジトリ内に存在し、パッケージ間で相互参照します。この構造特有の問題で TS2307 が発生しやすくなります。

npm/yarn/pnpm ワークスペース

ワークスペース機能を使うと、ローカルパッケージを npm パッケージと同じように import できます。しかし、設定が正しくないと TS2307 が発生します。

monorepo のプロジェクト構造
monorepo/
├── package.json          # ワークスペース定義
├── packages/
│   ├── shared/           # 共通パッケージ
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   └── src/index.ts
│   └── web-app/          # Webアプリ
│       ├── package.json
│       ├── tsconfig.json
│       └── src/index.ts

error TS2307: Cannot find module ‘@myorg/shared’ or its corresponding type declarations.

解決方法: ワークスペースの設定
// monorepo/package.json(npm workspaces)
{
  "workspaces": ["packages/*"]
}

// packages/shared/package.json
{
  "name": "@myorg/shared",
  "main": "./src/index.ts",
  "types": "./src/index.ts"
}

// packages/web-app/package.json
{
  "dependencies": {
    "@myorg/shared": "workspace:*"
  }
}

tsconfig の references(Project References)

TypeScript の Project References を使うと、パッケージ間の型情報を効率的に共有できます。

Project References の設定
// packages/web-app/tsconfig.json
{
  "compilerOptions": {
    "composite": true,
    "rootDir": "./src"
  },
  "references": [
    { "path": "../shared" }
  ]
}

// packages/shared/tsconfig.json
{
  "compilerOptions": {
    "composite": true,
    "declaration": true,
    "rootDir": "./src",
    "outDir": "./dist"
  }
}

pnpm の symlink 問題

pnpm はデフォルトで厳格な node_modules 構造を使うため、ワークスペースパッケージの参照で問題が起きやすくなります。

pnpm の設定
// .npmrc(pnpm の場合)
# symlink の問題を解決
shamefully-hoist=true

# または特定のパッケージのみ hoist
public-hoist-pattern[]=@types/*
public-hoist-pattern[]=*eslint*

フレームワーク固有のTS2307

各フレームワークには固有のモジュールや設定があり、それぞれ特有の TS2307 パターンがあります。

Next.js

Next.js プロジェクトで発生しやすい TS2307 パターンです。

error TS2307: Cannot find module ‘next/image’ or its corresponding type declarations.

解決方法: next の型定義を確認
# next がインストールされているか確認
npm ls next

# next を再インストール
npm install next@latest

# tsconfig.json に Next.js の型を含める
// tsconfig.json
{
  "compilerOptions": {
    "plugins": [{ "name": "next" }]
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
}

注意:Next.js プロジェクトでは next-env.d.ts ファイルが自動生成されます。このファイルが include に含まれていないと、next/imagenext/link の型が認識されません。next-env.d.ts.gitignore に入れないでください。

React(JSX設定)

React プロジェクトで JSX を使う場合の TS2307 パターンです。

React の tsconfig.json
// tsconfig.json
{
  "compilerOptions": {
    "jsx": "react-jsx",  // React 17+ の新しい JSX 変換
    "moduleResolution": "bundler",
    "lib": ["dom", "dom.iterable", "esnext"]
  }
}
必要なパッケージ
# React + 型定義のインストール
npm install react react-dom
npm install --save-dev @types/react @types/react-dom

Vue.js(.vue ファイル)

Vue.js の .vue ファイルを import すると TS2307 が発生します。

error TS2307: Cannot find module ‘./App.vue’ or its corresponding type declarations.

解決方法: .vue ファイルの型宣言
// src/env.d.ts(または src/shims-vue.d.ts)
declare module '*.vue' {
  import type { DefineComponent } from 'vue';
  const component: DefineComponent<{}, {}, any>;
  export default component;
}

Vite 環境の特殊性

Vite プロジェクトでは vite/client の型定義を参照する必要があります。

Vite の型定義参照
// tsconfig.json
{
  "compilerOptions": {
    "types": ["vite/client"]
  }
}

// または src/vite-env.d.ts
/// <reference types="vite/client" />

ポイント:Vite は import.meta.env や画像インポートなどの独自機能を持っています。vite/client の型定義を参照することで、これらの型が正しく認識されます。

Express / Node.js

Node.js のビルトインモジュールで TS2307 が出る場合は @types/node のインストールが必要です。

Node.js ビルトインモジュール
# @types/node のインストール
npm install --save-dev @types/node

// これで以下のインポートが解決する
import fs from 'fs';        // ✓
import path from 'path';    // ✓
import http from 'http';    // ✓
import { Buffer } from 'buffer';  // ✓

tsconfig.json の設定チェックリスト

TS2307 のトラブルシューティングで確認すべき tsconfig.json の設定を一覧にまとめます。

設定項目 役割 TS2307 との関係
moduleResolution モジュール解決戦略 環境に合った値を設定する必要がある
baseUrl paths の起点 paths を使う場合は必須
paths パスエイリアス エイリアス import には必須
rootDir ソースのルート 設定が間違っていると include に影響
rootDirs 仮想ディレクトリ結合 複数ルートの結合が必要な場合に使用
typeRoots 型定義の検索先 カスタム .d.ts の配置先を指定
types 使用する型パッケージ 指定すると、指定外の @types が無視される
include コンパイル対象ファイル .d.ts が含まれていないと型宣言が効かない
exclude 除外ファイル node_modules 等を除外(通常デフォルトで設定済み)
resolveJsonModule JSON import true にしないと .json が import できない
allowImportingTsExtensions .ts 拡張子 import noEmit と併用で .ts 拡張子を許可
推奨設定テンプレート(フロントエンド)
// tsconfig.json(React + Vite プロジェクト向け)
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "jsx": "react-jsx",
    "strict": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*"]
}
推奨設定テンプレート(Node.js バックエンド)
// tsconfig.json(Node.js + Express 向け)
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "node16",
    "moduleResolution": "node16",
    "strict": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*"]
}

実務でよくあるTS2307パターン10選

実務で頻繁に遭遇する TS2307 パターンとその解決方法をまとめます。

1. node_modules 再インストールで解決

ほとんどの TS2307 はこれで解決します。特に Git pull 後やブランチ切り替え後に試してください。

解決方法:rm -rf node_modules && npm install

2. IDE のキャッシュクリア(TypeScript サーバー再起動)

tsconfig.json を変更した後や、新しいパッケージをインストールした後に必要になることがあります。

解決方法:VSCode: Ctrl+Shift+P → "TypeScript: Restart TS Server"

3. tsconfig の include 漏れ

型宣言ファイル(.d.ts)が include に含まれていないと認識されません。

解決方法:"include": ["src/**/*", "types/**/*"]

4. @types パッケージのインストール忘れ

型定義が同梱されていないパッケージでは @types が必要です。

解決方法:npm install --save-dev @types/パッケージ名

5. パスエイリアスの設定不備

TypeScript とバンドラーの両方にエイリアスを設定する必要があります。

解決方法:baseUrl + paths + バンドラー設定の3点セット

6. CI/CD 環境での型エラー

ローカルでは動くのに CI で TS2307 が出る場合、大文字小文字やパッケージバージョンの問題です。

解決方法:npm ci を使って依存関係を厳密にインストール

7. Docker コンテナ内での問題

ホストとコンテナで OS が異なると、ネイティブモジュールの互換性問題が発生します。

解決方法:node_modules をコンテナ内で再ビルド

8. moduleResolution の設定ミス

bundler / node16 / nodenext の選択が環境に合っていないとエラーになります。

解決方法:環境に応じた正しい moduleResolution を設定

9. 画像・CSS の import

非 TS ファイルの import には型宣言が必要です。

解決方法:declare module "*.png" 等の型宣言ファイルを作成

10. monorepo のパッケージ参照

ローカルパッケージの参照には正しいワークスペース設定が必要です。

解決方法:workspace 設定 + package.json の dependencies

まとめ

TS2307 は TypeScript で最も頻繁に遭遇するエラーの一つです。この記事で解説した内容を振り返りましょう。

TS2307 解決フローチャート

TS2307 が発生したら、以下の順序で原因を切り分けてください。

TS2307 解決フロー

  • Step 1: エラーメッセージのモジュール名を確認する
  • Step 2: npm パッケージ名か、相対パスか、エイリアスかを判別する
  • Step 3(npmパッケージ): npm ls パッケージ名 でインストール確認 → なければ npm install
  • Step 4(@types): 型定義が同梱されていなければ npm i -D @types/パッケージ名
  • Step 5(相対パス): パスの階層・大文字小文字・拡張子を確認
  • Step 6(エイリアス): tsconfig.json の baseUrl / paths とバンドラー設定を確認
  • Step 7(非TSファイル): .d.ts の型宣言ファイルを作成
  • Step 8(moduleResolution): 環境に合った設定になっているか確認
  • Step 9: node_modules を削除して再インストール
  • Step 10: IDE の TypeScript サーバーを再起動

TS2307 と関連エラーの違い

TS2307 と混同しやすい関連エラーの違いを整理します。

エラー メッセージ 主な原因 主な解決策
TS2307 Cannot find module モジュールが見つからない npm install / パス修正 / @types
TS2304 Cannot find name 識別子が未宣言 import / declare / @types
TS2305 Module has no exported member エクスポートされていない named export を確認
TS2322 Type is not assignable 型の不一致 型を一致させる
TS2339 Property does not exist プロパティがない 型定義を修正
TS2345 Argument is not assignable 引数の型不一致 引数の型を修正

関連記事

TypeScriptの型システムやその他のエラーコードについてさらに深く学びたい方は、以下の記事もあわせてお読みください。

TypeScript 関連記事