Node.js で環境変数を参照するためのオブジェクト process.env
の型情報は、@types/node
で次のように文字列型ディクショナリ Dict<string>
として定義されています。
declare module "process" {
global {
var process: NodeJS.Process;
namespace NodeJS {
interface ProcessEnv extends Dict<string> {}
//...
}
}
export = process;
}
この型定義は @types/node
モジュールをインストールするだけで簡単に使用できるようになるのですが、具体的なキー名(環境変数名)が定義されていないので、Visual Studio Code などで process.env
以降の入力補完が効きません。
VS Code 上で環境変数名を補完入力 できるようにするには、次のような型定義ファイル (globals.d.ts
) をソースツリーのルートに作成します。
declare namespace NodeJS {
// 環境変数名の定義
interface ProcessEnv {
/** 現在の Node.js 実行環境 */
readonly NODE_ENV: 'development' | 'production' | 'test';
/** GitHub アクセストークン */
readonly MYAPP_GITHUB_TOKEN: string;
}
}
環境変数 NODE_ENV
の値は、決められた 3 種類の値 (development/production/test) のいずれかであると定義しているので、それ以外の値と比較しようとしたときに警告してくれます。
if (process.env.NODE_ENV === 'hoge') {
// 警告メッセージ ts(2367)
// This condition will always return 'false' since the types
// '"development" | "production" | "test"' and '"hoge"' have no overlap.
また、上記の型定義のように TSDoc/JSDoc ドキュメンテーションコメントを記述しておけば、VS Code で入力補完するときにドキュメントを表示してくれます。
ちなみに、このような型情報の追加が可能なのは、TypeScript の interface
定義が後付けで拡張できる (open-ended) という性質を持っているからです。
関連記事
- TypeScriptの型: 既存の JavaScript ライブラリに型情報を追加する(.d.ts ファイル)
- TypeScriptのモジュールのインポートには import を使う
- TypeScriptでモジュールを作成する/インポートする (export, import)
- TypeScriptで名前空間を定義する (namespace)
- TypeScriptの環境: tsc-watch で ts ファイルの変更監視&アプリの再起動を自動化する
- TypeScriptの環境: tsconfig.json の基本
- TypeScriptの環境: 既存の JavaScript プロジェクトを TypeScript に乗り換える