TypeScriptでノード環境変数を読み取るにはどうすればよいですか?
process.env.NODE_ENV
を使用すると、このエラーが発生します。
Property 'NODE_ENV' does not exist on type 'ProcessEnv'
@types/node
をインストールしましたが、助けにはなりませんでした。
Nodeプロセスで使用可能な環境変数(存在する場合)の保証はありません-NODE_ENV
変数は、Node自体。そのため、型定義に含めることはあまり意味がありません。代わりに、 これらはprocess.env
を次のように定義します :
export interface ProcessEnv {
[key: string]: string | undefined
}
つまり、process.env
は、文字列を取得するために文字列でインデックスを付けることができます(変数が設定されていない場合はundefined
)。エラーを修正するには、インデックス構文を使用する必要があります。
let env = process.env["NODE_ENV"];
あるいは、jcalzがコメントで指摘したように、TypeScript 2.2以降を使用している場合は、ドット構文を使用して上記で定義したようなインデックス可能な型にアクセスできます。この場合、コードはそのまま動作するはずです。
プロジェクトに@types/node
をインストールしたら、TypeScriptにprocess.env
に存在する変数を正確に伝えることができます。
environment.d.ts
declare global {
namespace NodeJS {
interface ProcessEnv {
GITHUB_AUTH_TOKEN: string;
NODE_ENV: 'development' | 'production';
PORT?: string;
PWD: string;
}
}
}
このメソッドはIntelliSenseを提供し、文字列リテラルタイプも利用します。
注:上記のスニペットはmodule拡張です。モジュール拡張を含むファイルは、modules(scriptsとは対照的)でなければなりません。モジュールとスクリプトの違いは、モジュールに少なくとも1つのインポート/エクスポートステートメントがあることです。
TypeScriptでファイルをモジュールとして処理するには、インポートステートメントを1つ追加するだけです。何でも構いません。
import * as ts from 'TypeScript'
でもできます。
使用する前に追加してくださいprocess.env.NODE_ENV
行に従う:
declare var process : {
env: {
NODE_ENV: string
}
}
TypeScriptの最新バージョンで実行した後:
_npm install --save @types/node
_
_process.env
_を直接使用できます。
console.log(process.env["NODE_ENV"])
_NODE_ENV
_を設定した場合、期待される結果が表示されます。
このために Type Assertion を使用できます
TypeScriptよりも値について多くのことを知る状況に陥ることがあります。通常、これは、エンティティのタイプが現在のタイプよりも具体的である可能性があることがわかっている場合に発生します。
型アサーションは、コンパイラーに「私を信頼して、私がやっていることを知っています」と伝える方法です。型アサーションは、他の言語での型キャストに似ていますが、データの特別なチェックや再構築は行いません。ランタイムに影響はなく、純粋にコンパイラーによって使用されます。 TypeScriptは、プログラマーが、必要な特別なチェックを実行したことを前提としています。
例
const nodeEnv: string = (process.env.NODE_ENV as string);
console.log(nodeEnv);
または、この特定の目的により適した env-var などのライブラリを見つけることもできます-
「正しい型付けでnode.jsの環境変数をロードおよびサニタイズするためのソリューション」
Reactプロジェクトの具体的な答えを探している方は、変数名はREACT_APP_
で始まる必要があります
詳細はこちら: https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables
.env
ファイルを作成します# Contents of .env file
AUTHENTICATION_API_URL="http://localhost:4000/login"
GRAPHQL_API_URL="http://localhost:4000/graphql"
.env
ファイルをdotenv
でprocess.env
にロードしますdotenv
を利用して、環境固有のprocess.env
変数を設定できます。 config.ts
ディレクトリにsrc/
というファイルを作成し、次のように入力します。
// Contents of src/config.ts
import {config as configDotenv} from 'dotenv'
import {resolve} from 'path'
switch(process.env.NODE_ENV) {
case "development":
console.log("Environment is 'development'")
configDotenv({
path: resolve(__dirname, "../.env.development")
})
break
case "test":
configDotenv({
path: resolve(__dirname, "../.env.test")
})
break
// Add 'staging' and 'production' cases here as well!
default:
throw new Error(`'NODE_ENV' ${process.env.NODE_ENV} is not handled!`)
}
注:このファイルを最上位ファイルにインポートする必要があります。おそらく、src/index.tsを介してimport './config'
(他のすべてのインポートの前に配置)
IProcessEnv
を定義します上記のメソッドをいくつか組み合わせた後、宣言されたIProcessEnv
インターフェイスが.env.*
ファイルに設定されているENV変数を反映することを保証するために、健全性のランタイムチェックを追加できます。以下のコンテンツはsrc/config.ts
にも保存できます
// More content in config.ts
const throwIfNot = <T, K extends keyof T>(obj: Partial<T>, prop: K, msg?: string): T[K] => {
if(obj[prop] === undefined || obj[prop] === null){
throw new Error(msg || `Environment is missing variable ${prop}`)
}else {
return obj[prop] as T[K]
}
}
// Validate that we have our expected ENV variables defined!
['AUTHENTICATION_API_URL', 'GRAPHQL_API_URL'].forEach(v => {
throwIfNot(process.env, v)
}
export interface IProcessEnv {
AUTHENTICATION_API_URL: string
GRAPHQL_API_URL: string
}
declare global {
namespace NodeJS {
interface ProcessEnv extends IProcessEnv { }
}
}
これにより、適切なIntelliSense/tslintタイプチェックと、さまざまな環境に展開する際の健全性が得られます。
注これはReactJSアプリでも機能します(NodeJSサーバーアプリではなく)。 ステップ(2)は省略できます。これはcreate-react-app
によって処理されるためです。
以下は、process.envの値を文字列としてプルするか、そうでなければエラーをスローすることが保証されている短い関数です。
より強力な(しかしより大きな)ものについては、他の人が env-var を提案しています。
/**
* Returns value stored in environment variable with the given `name`.
* Throws Error if no such variable or if variable undefined; thus ensuring type-safety.
* @param name - name of variable to fetch from this process's environment.
*/
export function env(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(`Missing: process.env['${name}'].`);
}
return value;
}
そうすると、次のようなコードを書くことができるはずです。
let currentEnvironment: string;
currentEnvironment = env('NODE_ENV');
TypeScrypeで.envを使用したい場合、簡単な方法があります(bashで動作します):
1-アプリケーションで.envファイルを作成します。
2- package.jsonでnpmスクリプトをセットアップします。
3-プロジェクトディレクトリに./dev.shファイルを作成します。 set -a; source .env; set +a; npm run dev
./dev.shファイルを使用してプロジェクトを実行します。
これにより、環境変数が設定されます。ファイルにPORT = 3000を設定している場合は、次を使用してアクセスできます。process.env.PORT