Error [error TS2591: Cannot find name 'process']

error TS2591: Cannot find name 'process' の直し方(TypeScript 6 で `types` の既定が空になった)

FIX SUMMARY verified
Applies when
node@sha256:d649c27dae7ba0137b3cef5dd75baa422c08dc3d9e3fc0c23dfb172dc3cc6436TypeScript 6.0+ (compilerOptions.types default changed from all @types to [])tsc after upgrading TypeScript to 6.0 or later with @types/node installed but no types field in tsconfig.json

Verified: reproduced in node@sha256:d649c27dae7ba0137b3cef5dd75baa422c08dc3d9e3fc0c23dfb172dc3cc6436, then the error TS2591: Cannot find name 'process' signature was gone after the fix (exit 0).

@types/node は devDependencies に入っています。それでも TypeScript を 6 に上げた tsc が止まります。

src/index.ts(1,20): error TS2591: Cannot find name 'process'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.

同じ検索で当たる表示ゆれは次のとおりです。

  • error TS2591: Cannot find name 'Buffer'(同じ 1 回の tsc で並んで出ます)
  • error TS2591: Cannot find name 'require'(同上。ただし require は module / moduleResolution の設定でも別の理由で出ます。process や Buffer と一緒に並んでいるならこの記事の話です)
  • error TS2304: Cannot find name '__dirname'(同じ原因なのにコードが違います。__dirname には @types/node を勧める後半が付かず、素の Cannot find name だけになります)
  • error TS2593: Cannot find name 'describe'. Do you need to install type definitions for a test runner?(@types/jest や vitest/globals を使っている場合)

メッセージは 2 つの手順を並べていますが、前半(npm i --save-dev @types/node)は空振りします。既に入っているからです。import process from "node:process" と明示 import に書き換えても抜けられません(後述)。直るのは後半だけです。

TypeScript 6.0 で compilerOptions.types の既定値が変わりました。 5.9 までは、types を書かなければ node_modules/@types 配下のパッケージをすべてグローバルに読み込んでいました。6.0 からの既定は [] で、何も読み込みません。修正は tsconfig.json に "types": ["node"] を1行足すことです。

{
  "compilerOptions": {
    "types": ["node"]
  }
}

なぜ TypeScript 6 で出るのか:types の既定が [] になった

同じソース・同じ tsconfig.json(types は書かない)・同じ @types/node のまま、TypeScript の版だけを変えると境界がそのまま出ます。

// src/index.ts
export const env = process.env.NODE_ENV ?? "development";
TypeScript結果終了コード
5.9.3通る0
6.0.3error TS2591: Cannot find name 'process'2
7.0.2同じメッセージ1

7.0 は 6.0 の既定をそのまま継承します。メッセージは同一で、終了コードだけが 6.0 の 2 から 7.0 で 1 に変わります(成否の判定=非ゼロかどうかは変わりません)。

types は「グローバルに読み込む型定義パッケージ」の指定です。5.9 までの既定は「@types にあるものは全部グローバルに入れる」で、@types/node を入れるだけで process も Buffer も見えていました。6.0 はそれを [] にしたので、インストールされていることと読み込まれることが別になりました。

@types/foo のようにパッケージ名と型定義の名前が対応するものは、import ... from "foo" すれば types に載せなくても解決されます。しかし @types/node が運ぶのは process や Buffer といったグローバルと、node:* のモジュール宣言です。どちらも types に載せない限りプログラムに入らないので、次の節のとおり明示 import へ書き換えても抜けられません。

@types/node を入れ直しても消えません

エラーメッセージは 2 つの手順を並べています。前半は npm i --save-dev @types/node、後半は add 'node' to the types field in your tsconfig です。前半をそのまま実行した後の実測がこれです。

$ npm i --save-dev @types/node
$ npx tsc --noEmit
src/index.ts(1,20): error TS2591: Cannot find name 'process'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.

@types/node は最初から入っているので、入れ直しても node_modules の中身は変わりません。変わっていないのは読み込む対象の指定のほうです。効くのは後半だけです。

明示 import に書き換えても消えません

グローバルに依存するのをやめて node:process から明示的に import する、という書き換えでも抜けられません。

import process from "node:process";

export const env = process.env.NODE_ENV ?? "development";
$ npx tsc --noEmit
src/index.ts(1,21): error TS2591: Cannot find name 'node:process'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.

types: [] の状態では @types/node がまったく読み込まれていません。node:process のモジュール宣言は @types/node/process.d.ts の中にある(declare module "node:process")ので、import 先の型定義そのものが存在しません。報告される位置がモジュール指定子の側(1 行 21 桁)に移るだけです。

つまり、この状況で先に必要なのは書き方の変更ではなく、types の指定です。

直し方:tsconfig.json の types に読み込むものを並べる

{
  "compilerOptions": {
    "strict": true,
    "module": "nodenext",
    "moduleResolution": "nodenext",
    "types": ["node"]
  }
}

types は配列なので、グローバルに要るものを全部並べます。

"types": ["node", "vitest/globals"]

@types/ を頭に付けないこと(node であって @types/node ではありません)。

移行の途中で 5.9 までの挙動へ戻したいときは、"types": ["*"] で @types 配下を全部読む状態に戻せます(同じソース・同じ依存で終了コード 0 になることを実測しています)。これは 6.0 が既定から外した挙動を明示的に呼び戻すもので、どのグローバルに依存しているかは記録されないままです。パッケージ名を並べる形に置き換える前提の一時措置として使ってください。依存しているグローバルを types に列挙し終えたら * を外す——それが外すタイミングです。

切り分け

  • Cannot find name 'describe' や Cannot find name 'it' が出る:テストランナーの型がグローバルから外れています。types に "jest" や "vitest/globals" を足してください。このときのエラーコードは TS2591 ではなく TS2593 で、メッセージも Do you need to install type definitions for a test runner? に変わります(@types/jest を入れたまま types を書かない状態で実測)。
  • 一部のファイルだけ直らない:プロジェクトが tsconfig.json を複数持っていて、そのファイルを拾っているのが別の設定です。npx tsc --showConfig で、実際に使われている types を確認してください。
  • error TS2688: Cannot find type definition file for 'node' に変わった:types に並べた名前に対応するパッケージが node_modules/@types にありません。node を並べたなら @types/node が必要です。The file is in the program because: Entry point of type library ... specified in compilerOptions が続きます。
  • エディタでは赤くならないのに tsc で落ちる:エディタとコマンドラインが別の TypeScript か、別の tsconfig.json を使っています。まず両方の版と、エディタがどの tsconfig.json を選んでいるかを確かめてください。
  • error TS2882: Cannot find module or type declarations for side-effect import も一緒に出ている:同じ TypeScript 6.0 の既定変更の別件です。noUncheckedSideEffectImports の既定が true になったほうで、原因も修正も別です。副作用 import が TS2882 で止まる場合 を見てください。
  • Option '...' has been removed も一緒に出ている:削除された compiler option の話で、こちらとは別の境界です。TypeScript が削除した compiler option を見てください。

検証環境

  • node@sha256:d649c27d...(node:22-bookworm-slim)、[email protected]、@types/[email protected]、ネットワーク有り
  • 再現:types を書かない tsconfig.json で npx tsc --noEmit が error TS2591: Cannot find name 'process' を出して終了コード 2
  • 修正:同じ依存・同じソースのまま tsconfig.json に "types": ["node"] を足すと終了コード 0

再現から修正までは errfix の検証ハーネスが機械的に確認しています。版の対照(5.9.3 が終了コード 0、6.0.3 が 2、7.0.2 が 1)、npm i --save-dev @types/node を実行した後も同じエラーが残ること、import process from "node:process" に書き換えても同じエラーコードのまま位置だけが移ることは、いずれも同じイメージで実測しています。

"types": ["*"] が終了コード 0 に戻すこと、Buffer と require が process と同じ TS2591 で並ぶ一方 __dirname だけ TS2304 になること、テストランナーのグローバルが TS2593 になること、types に実在しないパッケージ名を並べると TS2688 になること、tsc --showConfig が解決後の types を出力することも、同じイメージで実測しています。

エディタとコマンドラインで設定が食い違う場合の挙動は実測していません(切り分け節の該当項目は一般的な設定の話です)。

検証(machine-verified)

この修正は node@sha256:d649c27dae7ba0137b3cef5dd75baa422c08dc3d9e3fc0c23dfb172dc3cc6436 のバージョン固定コンテナ内で再現し、修正後に error TS2591: Cannot find name 'process' のシグネチャが消えることを機械で確認しています。

verify — run-case.mjs
$ node run-case.mjs node/typescript-6-types-default-empty
● reproduce error TS2591: Cannot find name 'process' present ✓
● apply fix exit 0
● re-run error TS2591: Cannot find name 'process' gone ✓
PASS verified · node@sha256:d649c27dae7ba0137b3cef5dd75baa422c08dc3d9e3fc0c23dfb172dc3cc6436 · signature gone

確認したのは上のイメージの中だけです。別の環境で直らなかった、記述が違う、という場合は 報告してください(対象と検証イメージは件名・本文に入ります)。