TypeScriptで開発をしていると、突然ターミナルやエディタに TS2304 というエラーが表示されることがあります。Cannot find name 'X' というメッセージとともに、コンパイルが止まってしまった経験はありませんか?
TS2304は「名前が見つからないエラー」を意味し、TypeScriptコンパイラがあなたのコード中にある識別子(変数名・関数名・型名など)を解決できないときに発生します。単純なタイポ(スペルミス)から、import忘れ、型定義ファイルの未インストール、tsconfig.jsonの設定不備、テスト・React・Node.jsなどの環境固有の問題まで、非常に幅広い原因で発生するエラーです。
この記事では、TS2304エラーを発生パターン別に徹底分類し、それぞれについて実際のエラーメッセージ・NGコード・原因の解説・OKコード(修正例)を掲載します。エラーが出たらこの記事を辞書的に参照すれば、すぐに原因を特定し解決できるはずです。
この記事で学べること
- TS2304エラーメッセージの読み方と意味
- 変数名のタイポ・宣言前の参照・スコープ外アクセスなど基本パターン
- import / export 関連の TS2304(named import・default import・循環参照・パスエイリアス)
- 型定義ファイル(.d.ts)関連の TS2304(@types・declare global・typeRoots)
- DOM API での TS2304(document / window / HTMLElement)
- Node.js 固有の TS2304(process / __dirname / Buffer / require)
- テストフレームワークでの TS2304(Jest / Vitest の describe / it / expect)
- React / JSX での TS2304(React・useState・カスタムコンポーネント)
- グローバル変数・環境変数での TS2304(window.XXX・process.env)
- tsconfig.json の設定で解決する TS2304(lib・types・include・paths)
- 実務でよくあるTS2304パターン10選
前提知識:この記事はTypeScriptの基本的な構文を理解している方を対象としています。型の基本から学びたい方は【TypeScript】型の書き方 完全入門を先にお読みください。
- TS2304エラーとは?
- 基本的なケースと解決方法
- import / export 関連のTS2304
- 型定義(.d.ts)関連のTS2304
- DOM API でのTS2304
- Node.js 固有のTS2304
- テストフレームワークでのTS2304
- React / JSX でのTS2304
- グローバル変数・環境変数でのTS2304
- tsconfig.json の設定で解決するTS2304
- 実務でよくあるTS2304パターン10選
- パターン1: ライブラリの型定義が不足している
- パターン2: グローバル変数(jQuery の $ 、Google Analytics の gtag)
- パターン3: Jest / Vitest のテスト関数
- パターン4: Node.js の process / __dirname
- パターン5: React の useState / useEffect の import 忘れ
- パターン6: tsconfig.json の lib に DOM がない
- パターン7: モジュールの拡張子問題
- パターン8: monorepo でのパッケージ参照
- パターン9: CI/CD 環境での型エラー
- パターン10: const enum を isolatedModules で使う
- まとめ
TS2304エラーとは?
TS2304 は TypeScript コンパイラが出す「名前解決エラー」です。コード中で使用された識別子(変数名・関数名・型名・インターフェース名など)がどこにも宣言されていない、またはコンパイラから見える範囲に存在しないと判断されたときに発生します。正式なエラーメッセージは次のとおりです。
error TS2304: Cannot find name ‘X’.
日本語に訳すと「名前 ‘X’ が見つかりません」となります。ここでの ‘X’ は変数名、関数名、型名、インターフェース名など、あらゆる識別子が該当します。TypeScriptコンパイラが「あなたが使おうとしている名前は、現在のスコープや型情報のどこにも定義されていません」と教えてくれているのです。
エラーメッセージの読み方
TS2304のエラーメッセージは、以下のフォーマットに従っています。具体例で構造を確認しましょう。
このエラーメッセージは以下のパーツで構成されています。
覚え方:「Cannot find name ‘あなたが使おうとした名前‘」— TypeScriptは「その名前、どこにも見つかりません」と言っています。宣言・import・型定義のどれかが不足している可能性が高いです。
なぜTS2304エラーが発生するのか
TypeScriptは静的型付け言語であり、コードを実行する前にすべての識別子が宣言されているかどうかをチェックします。JavaScriptでは未宣言の変数を参照すると実行時に ReferenceError が発生しますが、TypeScriptではコンパイル時にこれを検出し、TS2304として報告します。
TS2304が発生する根本原因は、大きく分けて以下の6つに分類できます。
以降のセクションでは、これらの分類ごとに具体的なパターンを一つずつ詳しく解説していきます。
TS2304 と似たエラーコードとの違い
TS2304と混同しやすいエラーコードがいくつかあります。先に違いを整理しておきましょう。
注意:TS2552 は TS2304 の「親切版」です。TypeScript がタイポを検出できた場合は TS2552 になり、修正候補を提示してくれます。修正候補がない場合に TS2304 が出ます。
基本的なケースと解決方法
まずは最も基本的なパターンから見ていきましょう。コードそのものに問題があるケースです。TS2304エラーの中で最もシンプルで解決しやすいパターンですが、初心者が最初に遭遇しやすいものでもあります。
変数名・関数名のタイポ(スペルミス)
最も多い原因の一つが、単純なタイプミスです。変数名や関数名を1文字でも間違えると、TypeScriptは「その名前は宣言されていない」と判断してTS2304を出します。
error TS2304: Cannot find name ‘consle’.
原因:userNmae は userName のタイポ、consle は console のタイポ、calulateTotal は calculateTotal のタイポです。TypeScriptは名前を厳密に照合するため、1文字でも違えば「見つからない」と判断します。
ポイント:VS Code などのエディタでは、タイポがあると TS2552(Did you mean ‘X’?)としてスペル候補を提示してくれることがあります。エディタの赤い波線と提案メッセージを確認しましょう。
大文字・小文字の間違い
JavaScriptとTypeScriptは大文字・小文字を区別(case-sensitive)します。Array と array、String と string は別の識別子です。
error TS2304: Cannot find name ‘userService’.
原因:UserService(大文字始まり)はクラス名であり、userService(小文字始まり)というインスタンスはどこにも宣言されていません。クラスを使うにはまず new でインスタンス化する必要があります。
宣言前に参照している(TDZ: Temporal Dead Zone)
let や const で宣言された変数は、宣言文より前のコードでは参照できません。これはTemporal Dead Zone(TDZ / 一時的なデッドゾーン)と呼ばれるJavaScript/TypeScriptの仕様です。
error TS2304: Cannot find name ‘message’.
原因:const や let で宣言した変数は、宣言が実行されるまで「存在しない」扱いになります。これはホイスティング(巻き上げ)されても初期化前はアクセスできないというES2015+の仕様です。TypeScriptはこれをコンパイル時に検出します。
注意:var で宣言した変数はホイスティングにより宣言前でも undefined として参照できますが、const / let ではTDZにより参照できません。モダンなTypeScriptでは var の使用は避けるべきです。
import の忘れ
他のモジュールで定義された関数や型を使おうとして、import 文を書き忘れているケースです。これは非常によくあるパターンです。
error TS2304: Cannot find name formatDate.
原因:TypeScriptのモジュールシステムでは、他のファイルで export された識別子を使うには、必ず import 文で明示的に読み込む必要があります。
ポイント:VS Code では、未インポートの識別子にカーソルを合わせて Ctrl + .(Quick Fix)を押すと、自動でimport文を追加してくれます。積極的に活用しましょう。
スコープ外の変数にアクセス
ブロックスコープ({ })の中で宣言された変数を、そのブロックの外から参照しようとするとTS2304が発生します。
error TS2304: Cannot find name result.
import / export 関連のTS2304
モジュールシステムに起因するTS2304は、実務で最も頻繁に遭遇するパターンです。named import の名前間違い、default import との混同、パスエイリアスの設定不備など、多くのバリエーションがあります。
named import の名前間違い
エクスポートされた名前と異なる名前でインポートしようとすると TS2304 が発生します。
error TS2304: Cannot find name ”formatCurrency”.
default import vs named import の混同
default export と named export を混同すると、インポート時にエラーが発生します。
循環参照(Circular Dependency)による問題
ファイルAがファイルBをインポートし、ファイルBがファイルAをインポートする循環参照が発生すると、一方のファイルでインポートした識別子が undefined になり、TS2304が発生することがあります。
解決策:共通の型定義を別ファイルに切り出すか、import type を使って型のみのインポートに切り替えます。型のみのインポートは実行時にはコードが生成されないため、循環参照の問題を回避できます。
パスエイリアス(@/ ~)の設定不備
@/ などのパスエイリアスを使ったインポートでエラーが出る場合、tsconfig.json の paths 設定が不足しています。
注意:Vite や webpack を使っている場合、ビルドツール側にも同じエイリアス設定が必要です。tsconfig.json だけでは実行時のパス解決ができません。
.ts 拡張子の有無による問題
TypeScriptのインポートでは、拡張子を付けるかどうかが moduleResolution の設定によって異なります。
ポイント:moduleResolution: "nodenext" では、TypeScriptファイルでも .js 拡張子を付けてインポートします。これはTypeScriptがコンパイル後のJavaScriptファイルのパスを参照するためです。
型定義(.d.ts)関連のTS2304
外部ライブラリの型定義が不足していたり、グローバル型の宣言が漏れている場合にTS2304が発生します。このセクションでは、@types パッケージ、declare 文、tsconfig.json の typeRoots / types 設定について解説します。
@types パッケージの未インストール
JavaScriptで書かれたライブラリを TypeScript で使う場合、型定義パッケージ(@types/xxx)のインストールが必要な場合があります。
error TS2304: Cannot find name ”$”.
グローバル型の定義方法(declare global)
アプリケーション固有のグローバル変数や型を定義するには、declare global を使います。
error TS2304: Cannot find name ”APP_CONFIG”.
これで APP_CONFIG をTypeScriptが認識できるようになります。.d.ts ファイルは tsconfig.json の include パターンに含まれるディレクトリに配置してください。
カスタム型定義ファイルの作成
@types パッケージが存在しないライブラリを使う場合、自分で型定義ファイルを作成する必要があります。
tsconfig.json の typeRoots / types 設定
typeRoots と types の設定が不適切だと、型定義ファイルが読み込まれず TS2304 が発生します。
注意:types を指定すると、指定したパッケージのみが自動読み込みされます。例えば "types": ["node"] と設定すると、@types/jest がインストールされていても読み込まれません。
ambient declaration(declare)の使い方
declare キーワードは、TypeScriptに「この識別子は実行時に存在する」と伝えるための宣言です。外部スクリプトで定義されたグローバル変数や、CDNで読み込んだライブラリの型を宣言する際に使います。
ポイント:declare global を使うファイルには、export {} を追加してモジュールとして認識させる必要があります。これがないと、ファイル全体がグローバルスクリプトとして扱われ、意図しない動作になる場合があります。
DOM API でのTS2304
ブラウザで実行するコードでは document、window、HTMLElement などの DOM API を使いますが、TypeScriptの設定によってはこれらが認識されずTS2304が発生します。
document / window が見つからない
最も多いケースは、tsconfig.json の lib に "DOM" が含まれていない場合です。
error TS2304: Cannot find name ”document”.
HTMLElement / Event 等のDOM型
HTMLElement、HTMLInputElement、Event、MouseEvent などのDOM型も lib: ["DOM"] に依存します。
error TS2304: Cannot find name ”HTMLInputElement”.
解決策:tsconfig.json の lib に "DOM" を追加します。前述の設定と同じです。
Node.js 環境で DOM を参照した場合
Node.js(サーバーサイド)のコードで document や window を使うと、lib に "DOM" を追加していてもロジック的に間違いです。これは設計上の問題であり、DOM APIは使えません。
注意:Node.js環境の tsconfig.json では lib に "DOM" を入れるべきではありません。DOM APIが使えてしまうと、サーバーサイドで実行時エラーになります。SSRやテスト環境でDOMが必要な場合は jsdom などのライブラリを使いましょう。
tsconfig.json の lib 設定の選び方
プロジェクトの実行環境に合わせて lib を設定しましょう。
Node.js 固有のTS2304
Node.js環境特有のグローバル変数やモジュールを使う際に発生するTS2304です。@types/node のインストールと正しい設定が鍵となります。
process / __dirname / __filename / Buffer / require
Node.jsのグローバル変数は、@types/node がインストールされていないとTS2304になります。
error TS2304: Cannot find name ”process”.
ES Modules での __dirname / __filename
ES Modules("type": "module")では、__dirname と __filename は使えません。代わりに import.meta.url を使います。
error TS2304: Cannot find name ”__dirname”.
global / globalThis の使い方
Node.jsのグローバルオブジェクトにカスタムプロパティを追加する場合は、型定義の拡張が必要です。
注意:declare global 内で var を使う理由は、const や let はグローバルスコープに変数を追加できないためです。これは TypeScript の仕様です。
テストフレームワークでのTS2304
Jest や Vitest などのテストフレームワークが提供するグローバル関数(describe、it、expect など)でTS2304が発生するケースです。テスト専用の型設定が必要です。
Jest: describe / it / expect / jest
Jestのテストファイルで describe や expect が見つからない場合、@types/jest のインストールと設定が必要です。
error TS2304: Cannot find name ”describe”.
Vitest: vi / describe / expect
Vitest は独自の型定義を持っています。@types/jest は不要で、代わりに Vitest の設定が必要です。
ポイント:Vitest では globals: true を設定しなくても、各テストファイルで import { describe, it, expect } from ''vitest'' と明示的にインポートする方法もあります。この方法なら型設定の問題を完全に回避できます。
tsconfig の include 設定の確認
テストファイルが tsconfig.json の include に含まれていないと、型チェックの対象外となりTS2304が出ます。
React / JSX でのTS2304
React開発では、JSX構文やフックの使い方に関連するTS2304が発生することがあります。React 17以降のJSX Transformの変更も重要なポイントです。
React が見つからない(React 17+ の jsx transform)
React 17以前は、JSXを使うファイルに import React from ''react'' が必要でした。React 17以降の新しいJSX Transformでは不要になりましたが、tsconfig.jsonの設定が必要です。
error TS2304: Cannot find name ”React”.
カスタムコンポーネント名の大文字/小文字
Reactでは、カスタムコンポーネントは大文字で始める必要があります。小文字で始まるとHTML要素として解釈されます。
useState / useEffect の import 忘れ
Reactのフック関数は react パッケージからインポートする必要があります。
error TS2304: Cannot find name ”useState”.
グローバル変数・環境変数でのTS2304
ブラウザのグローバル変数(window.XXX)や環境変数(process.env.XXX)に型がないとTS2304が発生します。型定義の拡張で対処します。
window にカスタムプロパティを追加する場合
CDNで読み込んだライブラリや、HTMLのscriptタグで定義したグローバル変数を TypeScript で使う場合、Window インターフェースの拡張が必要です。
error TS2304: Cannot find name ”gtag”.
process.env の型定義
環境変数は process.env.XXX の形でアクセスしますが、デフォルトでは string | undefined 型です。カスタムの環境変数に型を付けるには、NodeJS.ProcessEnv を拡張します。
Vite の環境変数(import.meta.env)
Viteでは process.env ではなく import.meta.env を使います。カスタム環境変数の型は ImportMetaEnv を拡張して定義します。
error TS2304: Cannot find name ”ImportMetaEnv”.
ポイント:Viteの環境変数は VITE_ プレフィックスが付いたものだけがクライアントサイドに公開されます。VITE_ のない環境変数はサーバーサイドのみで利用可能です。
tsconfig.json の設定で解決するTS2304
tsconfig.json の設定が原因でTS2304が発生するケースを体系的にまとめます。設定一つで多くのエラーが解消されることがあります。
lib オプション
lib は、TypeScriptが認識するビルトインAPIの範囲を指定します。
include / exclude の設定ミス
include パターンにファイルが含まれていないと、そのファイルは型チェックの対象外となりTS2304が出ます。
moduleResolution の選択
moduleResolution はモジュールの解決戦略を指定します。設定によってインポートの挙動が大きく変わります。
baseUrl / paths の設定
baseUrl と paths を使ったパスエイリアスの設定例です。
注意:paths は TypeScript コンパイラの型解決にのみ影響します。実行時のモジュール解決には影響しません。Vite なら resolve.alias、webpack なら resolve.alias で同じパスマッピングを設定する必要があります。
tsconfig の設定チェックリスト
TS2304が発生したときの tsconfig.json チェックリストです。
tsconfig.json チェックリスト
libに必要なライブラリ(DOM, ES2020 等)が含まれているか?typesを指定している場合、必要な型パッケージが全て列挙されているか?typeRootsにカスタム型定義ディレクトリが含まれているか?includeにソースファイルとテストファイルが含まれているか?excludeで必要なファイルを除外していないか?moduleResolutionがプロジェクトの実行環境に合っているか?baseUrl/pathsがビルドツール側の設定と一致しているか?
実務でよくあるTS2304パターン10選
ここまでの内容を踏まえた上で、実際の開発現場でよく遭遇するTS2304パターンをランキング形式でまとめます。
パターン1: ライブラリの型定義が不足している
JavaScriptライブラリを使う際に @types/xxx のインストールを忘れるケースです。
パターン2: グローバル変数(jQuery の $ 、Google Analytics の gtag)
CDNで読み込んだライブラリのグローバル変数です。declare 文か @types パッケージで型を定義します。
パターン3: Jest / Vitest のテスト関数
describe、it、expect、jest、vi が見つからないケースです。@types/jest または vitest/globals の設定が必要です。
パターン4: Node.js の process / __dirname
@types/node のインストール忘れ、またはES Modulesでの __dirname 使用です。
パターン5: React の useState / useEffect の import 忘れ
Reactフックのインポートを忘れるパターンです。VS Code の Quick Fix で自動追加しましょう。
パターン6: tsconfig.json の lib に DOM がない
フロントエンドプロジェクトで document や window が使えないケースです。lib: ["DOM"] を追加します。
パターン7: モジュールの拡張子問題
moduleResolution: "nodenext" で拡張子が必要なのに省略しているケースです。.js 拡張子を付けるか、moduleResolution: "bundler" に切り替えます。
パターン8: monorepo でのパッケージ参照
monorepo構成で他パッケージの型が解決できないケースです。references を使った Project References や、パッケージの types フィールド設定が必要です。
パターン9: CI/CD 環境での型エラー
ローカルでは動くのにCI/CDで TS2304 が出るケースです。主な原因は以下の通りです。
パターン10: const enum を isolatedModules で使う
isolatedModules: true(Vite / esbuild のデフォルト)の環境で、別ファイルの const enum を参照するとTS2304が発生することがあります。
まとめ
TS2304(Cannot find name)は、TypeScript開発で非常に頻繁に遭遇するエラーです。この記事で解説したパターンを最後に振り返りましょう。
TS2304 の解決フローチャート
- 1. タイポ・スペルミスはないか? → エディタの補完機能を活用
- 2. import 文を書き忘れていないか? → VS Code の Quick Fix (Ctrl + .)
- 3. @types パッケージはインストールされているか? →
npm install -D @types/xxx - 4. tsconfig.json の lib は正しいか? → DOM / ES2020 等を確認
- 5. tsconfig.json の types は正しいか? → 指定している場合、全ての型を列挙
- 6. tsconfig.json の include にファイルが含まれているか? → .tsx やテストファイルも含める
- 7. declare 文やカスタム型定義ファイルが必要か? → .d.ts を作成
TS2304 と関連エラーの違いまとめ
関連記事
TypeScriptの型システムやその他のエラーコードについてさらに深く学びたい方は、以下の記事もあわせてお読みください。
TypeScript 関連記事
- 【TypeScript】型の書き方 完全入門 – 基本型から応用型まで体系的に学ぶ
- 【TypeScript】よくあるエラーと解決方法 – 主要エラーコードの一覧と解決策
- 【TypeScript】tsconfig.json 完全ガイド – 全オプションの解説と推奨設定
- 【TypeScript】TS2322の原因と解決方法 – Type is not assignable to type の完全解説
- 【TypeScript】TS2339の原因と解決方法 – Property does not exist on type の完全解説
- 【TypeScript】TS2345の原因と解決方法 – Argument is not assignable の完全解説
- 【TypeScript】TS7006の原因と解決方法 – Parameter implicitly has an any type の完全解説

