web-dev-qa-db-ja.com

TypeScriptでprocess.envを使用する

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以降を使用している場合は、ドット構文を使用して上記で定義したようなインデックス可能な型にアクセスできます。この場合、コードはそのまま動作するはずです。

10
Joe Clay

プロジェクトに@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拡張です。モジュール拡張を含むファイルは、modulesscriptsとは対照的)でなければなりません。モジュールとスクリプトの違いは、モジュールに少なくとも1つのインポート/エクスポートステートメントがあることです。

TypeScriptでファイルをモジュールとして処理するには、インポートステートメントを1つ追加するだけです。何でも構いません。 import * as ts from 'TypeScript'でもできます。

10
Karol Majewski

使用する前に追加してくださいprocess.env.NODE_ENV行に従う:

declare var process : {
  env: {
    NODE_ENV: string
  }
}
8
haiflive

TypeScriptの最新バージョンで実行した後:

_npm install --save @types/node_

_process.env_を直接使用できます。

console.log(process.env["NODE_ENV"])

_NODE_ENV_を設定した場合、期待される結果が表示されます。

5
pwxcoo

このために Type Assertion を使用できます

TypeScriptよりも値について多くのことを知る状況に陥ることがあります。通常、これは、エンティティのタイプが現在のタイプよりも具体的である可能性があることがわかっている場合に発生します。

型アサーションは、コンパイラーに「私を信頼して、私がやっていることを知っています」と伝える方法です。型アサーションは、他の言語での型キャストに似ていますが、データの特別なチェックや再構築は行いません。ランタイムに影響はなく、純粋にコンパイラーによって使用されます。 TypeScriptは、プログラマーが、必要な特別なチェックを実行したことを前提としています。

const nodeEnv: string = (process.env.NODE_ENV as string);
console.log(nodeEnv);

または、この特定の目的により適した env-var などのライブラリを見つけることもできます-

「正しい型付けでnode.jsの環境変数をロードおよびサニタイズするためのソリューション」

5
Ville

Reactプロジェクトの具体的な答えを探している方は、変数名はREACT_APP_で始まる必要があります

詳細はこちら: https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables

1
gkri

1. .envファイルを作成します

# Contents of .env file
AUTHENTICATION_API_URL="http://localhost:4000/login"
GRAPHQL_API_URL="http://localhost:4000/graphql"

2. .envファイルをdotenvprocess.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'他のすべてのインポートの前に配置

3. ENV変数を確認し、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によって処理されるためです。

1
The Aelfinn

以下は、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');
1
Peter W

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

0
Arman