TypeScriptで環境変数を使う
TypeScriptでprocess.env
を使う
Node.jsの環境変数にアクセスするには、process.env
オブジェクトを使用します。TypeScriptでは、このオブジェクトを型安全に使用するために、型定義をインポートする必要があります。
基本的な使い方
- 型定義のインポート
import 'node:process';
- 環境変数の取得
const MY_VAR = process.env.MY_VAR;
型安全な使い方
TypeScriptは、環境変数の型を推論し、型チェックを行います。
const MY_NUMBER = Number(process.env.MY_NUMBER); // 型はnumber
const MY_STRING = process.env.MY_STRING as string; // 型はstring
オプションのチェーンニング
環境変数が存在しない場合にエラーを回避するために、オプションのチェーンニングを使用できます。
const MY_OPTIONAL_VAR = process.env.MY_OPTIONAL_VAR?.toString();
環境変数の設定
Node.jsの環境変数は、コマンドライン引数または環境変数ファイルを使用して設定できます。
例
node app.js MY_VAR=myValue
または、.env
ファイルを作成し、以下のように設定します。
MY_VAR=myValue
注意
- 環境変数の存在はチェックしてください。存在しない場合にエラーが発生する可能性があります。
- 環境変数の値は常に文字列として取得されます。必要に応じて適切な型に変換してください。
TypeScriptで環境変数を使うメリット
TypeScriptでprocess.env
を使うことで、Node.jsアプリケーションの環境設定を柔軟かつ安全に行うことができます。主なメリットは以下の通りです。
- リファクタリングの容易さ
環境変数の名前を変更する場合、一箇所で変更すれば済みます。 - コードの可読性向上
環境変数を直接文字列で参照するよりも、定数に代入することでコードの可読性が向上します。 - 型安全
TypeScriptの型システムにより、環境変数の型を明示的に指定でき、実行時エラーを減らすことができます。
コード例
型定義のインポート
import 'node:process';
この行で、Node.jsのprocess
モジュールの型定義をインポートします。これにより、process.env
オブジェクトの型がTypeScriptコンパイラに認識されます。
環境変数の取得
const PORT = process.env.PORT || 3000;
|| 3000
:PORT
が未定義の場合、デフォルト値の3000
を代入します。process.env.PORT
: 環境変数PORT
の値を取得します。
型の指定
const NODE_ENV = process.env.NODE_ENV as 'development' | 'production';
as 'development' | 'production'
:NODE_ENV
の値が'development'
か'production'
のいずれかであることを明示的に指定します。
const DATABASE_URL = process.env.DATABASE_URL?.replace(/^postgres:\/\/([^:]+):([^@]+)@(.*)/, 'postgresql://localhost:$3');
replace
:DATABASE_URL
の値を置換します。?.
:process.env.DATABASE_URL
がundefined
の場合、以降の処理を実行しません。
実用的な例
import 'node:process';
const PORT = Number(process.env.PORT) || 3000;
const DATABASE_URL = process.env.DATABASE_URL as string;
console.log(`Server listening on port ${PORT}`);
console.log(`Connecting to database: ${DATABASE_URL}`);
この例では、PORT
を数値に変換し、DATABASE_URL
を文字列として扱っています。
注意点
- セキュリティ
秘密情報(APIキーなど)を環境変数に直接設定するのは避けるべきです。 - 型安全
TypeScriptの型システムは強力ですが、実行時に予期しない型の値が渡される可能性もあります。適切なエラー処理を組み込むようにしましょう。 - 環境変数の設定
環境変数は、コマンドライン引数、環境変数ファイル、またはDockerなどのコンテナオーケストレーションツールで設定します。
TypeScriptでprocess.env
を使うことで、Node.jsアプリケーションの環境設定をより安全かつ柔軟に行うことができます。型定義をインポートし、オプションチェーンニングなどを活用することで、より堅牢なアプリケーションを開発することができます。
- tsconfig.json
tsconfig.json
ファイルでbaseUrl
やpaths
を設定することで、相対パスでのモジュールインポートを可能にします。 - dotenv
dotenv
モジュールを使うと、.env
ファイルから環境変数を簡単に読み込むことができます。
dotenvモジュールを利用する
- デメリット
- メリット
.env
ファイルで環境変数を管理することで、コードと設定を分離できます。- Gitで
.env
ファイルを管理から除外することで、機密情報を漏洩するリスクを減らせます。
- 特徴
.env
ファイルに環境変数を定義し、dotenv
モジュールで読み込む方法です。
import * as dotenv from 'dotenv';
dotenv.config();
const PORT = process.env.PORT || 3000;
tsconfig.jsonでカスタム型を作成する
- デメリット
- メリット
- プロジェクト全体で統一された型定義を作成できます。
- 型チェックがより厳密になり、バグを防ぎやすくなります。
- 特徴
tsconfig.json
ファイルでカスタム型を作成し、process.env
の型をより厳密に定義する方法です。
// tsconfig.json
{
"compilerOptions": {
// ...
"types": ["node", "./custom-types"]
}
}
// custom-types.d.ts
declare namespace NodeJS {
interface ProcessEnv {
PORT: string;
DATABASE_URL: string;
}
}
環境変数管理ライブラリを利用する
- メリット
dotenv
モジュールの機能を拡張したり、より安全な環境変数管理を実現できます。- 複数のプロジェクトで共通の環境変数管理方法を採用できます。
- 特徴
dotenv-safe
,config
などの環境変数管理ライブラリを利用する方法です。
カスタム関数で環境変数をラップする
- デメリット
- メリット
- プロジェクトに合わせてカスタマイズした関数を作成できます。
- 環境変数の値に対する処理を集中管理できます。
- 特徴
自前で関数を作成し、process.env
へのアクセスをラップする方法です。
function getEnv(name: string, defaultValue: string): string {
return process.env[name] || defaultValue;
}
const PORT = getEnv('PORT', '3000');
どの方法を選ぶべきか?
- プロジェクトに合わせてカスタマイズしたい場合
カスタム関数でラップする方法がおすすめです。 - より高度な機能やセキュリティが必要な場合
環境変数管理ライブラリがおすすめです。 - プロジェクト全体で統一した型定義を作成したい場合
tsconfig.json
でカスタム型を作成する方法がおすすめです。 - シンプルで手軽に利用したい場合
dotenv
モジュールがおすすめです。
選択のポイント
- セキュリティ要件
- 環境変数の数や複雑さ
- チームの開発スタイル
- プロジェクトの規模
これらの要素を考慮して、最適な方法を選択してください。
- Next.js
Next.jsでは、next.config.js
で環境変数を設定できます。 - React
Create React Appなどでは、process.env.REACT_APP_
で始まる環境変数が自動的に設定されます。
node.js typescript