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選
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.json と node_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.json の compilerOptions.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 が設定されているか |
paths は baseUrl なしでは動作しない |
| paths のパターンが正しいか |
@/* の * はワイルドカード。配列で複数指定可能 |
| include にファイルが含まれるか |
include に src/**/* が含まれているか確認 |
| バンドラー側の設定 |
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.json の resolveJsonModule を有効にすることで解決できます。
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.json の include に含まれていなければ効果がありません。
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.json の exports フィールドが優先されます。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/image や next/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の型システムやその他のエラーコードについてさらに深く学びたい方は、以下の記事もあわせてお読みください。