TypeScriptプロジェクトで `process.env` を使用した際に `error TS2591: Cannot find name 'process'` が発生した。解決策として正しいものはどれか?
解説
この問題の鍵は、TypeScriptがNode.js固有のグローバルオブジェクトの型定義を標準では持っていないという点です。@types/nodeをインストールし、tsconfig.jsonのtypesに"node"を追加するのが正しいアプローチです。なぜ他の選択肢では解決しないのかimport process from 'process'はNode.js v16以降のESMで動作しますが、TypeScriptの型解決の問題は残ります。結局@types/nodeがなければprocessモジュール自体の型定義が見つからず、別の型エラーが発生します。targetを"node"に変更するは根本的な誤りです。targetはトランスパイル後のJavaScriptバージョン(es2020、es2022など)を指定するオプションであり、実行環境やNode.jsの型定義とは無関係です。@types/processというパッケージは存在しますが、一般的な解決策ではありません。process、Buffer、__dirname、requireなどNode.jsグローバルの型定義はすべて@types/nodeに内包されており、個別にインストールする必要はありません。TypeScriptの型定義解決の仕組みTypeScriptはnode_modules/@types/配下の型定義パッケージを自動検出します。ただしtsconfig.jsonにtypesフィールドを明示的に指定している場合、そこに列挙されたパッケージのみが読み込まれます。つまり、@types/nodeをインストールしただけでは不十分なケースがあります。// tsconfig.json { "compilerOptions": { "types": ["node"] // これがないと認識されない場合がある } }逆にtypesフィールドを省略すれば@types/*配下がすべて自動読み込みされますが、意図しない型の混入を防ぐために明示指定するプロジェクトも多いです。よくあるミスと落とし穴@types/nodeをインストールしたのにエラーが消えないケースでは、typesフィールドの設定漏れがほとんどです。// ありがちなミス: typesに jest だけ指定して node を忘れる { "compilerOptions": { "types": ["jest"] // "node" がないのでprocessが未定義になる } } // 修正 { "compilerOptions": { "types": ["jest", "node"] } }また、モノレポ構成でtsconfig.jsonがルートとパッケージごとに複数存在する場合、子側の設定が親のtypesを上書きしてしまい、特定パッケージだけエラーになるケースもあります。実務でのベストプラクティスNode.jsプロジェクト初期化時にnpm i -D typescript @types/nodeをセットで実行する習慣をつけるフロントエンドプロジェクトでは@types/nodeを入れるとブラウザに存在しないAPIの型が混入するため、typesフィールドで制御するか、import.meta.env(Vite)などフレームワーク固有の環境変数アクセス方法を使うprocess.envの型安全化: デフォルトではstring | undefined型になるため、環境変数の型定義ファイルを用意すると型安全に扱える// env.d.ts declare namespace NodeJS { interface ProcessEnv { NODE_ENV: 'development' | 'production'; DATABASE_URL: string; API_KEY: string; } }