@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.3 | error 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 を出力することも、同じイメージで実測しています。
エディタとコマンドラインで設定が食い違う場合の挙動は実測していません(切り分け節の該当項目は一般的な設定の話です)。