web-dev-qa-db-fra.com

utiliser process.env dans TypeScript

Comment lire les variables d'environnement de noeud dans TypeScript? 

Si j'utilise process.env.NODE_ENV j'ai cette erreur:

Property 'NODE_ENV' does not exist on type 'ProcessEnv'

J'ai installé @types/node mais cela n'a pas aidé.

12

Rien ne garantit (le cas échéant) quelles variables d'environnement seront disponibles dans un processus de noeud - la variable NODE_ENV est simplement une convention popularisée par Express, plutôt que quelque chose d'intégré au noeud lui-même. En tant que tel, il n’aurait pas vraiment de sens que cela soit inclus dans les définitions de types. Au lieu de cela, ils définissent process.env comme ceci :

export interface ProcessEnv {
    [key: string]: string | undefined
}

Cela signifie que process.env peut être indexé avec une chaîne afin de récupérer une chaîne (ou undefined, si la variable n'est pas définie). Pour corriger votre erreur, vous devrez utiliser la syntaxe d'index:

let env = process.env["NODE_ENV"];

Comme le souligne jcalz dans les commentaires, si vous utilisez TypeScript 2.2 ou une version plus récente, vous pouvez accéder aux types indexables tels que celui défini ci-dessus à l'aide de la syntaxe à points. Dans ce cas, votre code devrait simplement fonctionner tel quel.

8
Joe Clay

il suffit d'ajouter avant l'utilisation process.env.NODE_ENV les lignes suivantes:

declare var process : {
  env: {
    NODE_ENV: string
  }
}
3
user3335983

Une fois que vous avez installé @type/node dans votre projet, vous pouvez indiquer à TypeScript exactement les variables présentes dans votre process.env:

environment.d.ts

declare global {
  namespace NodeJS {
    interface ProcessEnv {
      GITHUB_AUTH_TOKEN: string;
      NODE_ENV: 'development' | 'production';
      PORT?: string;
      PWD: string;
    }
  }
}

Cette méthode vous donnera IntelliSense, et tire également parti des types littéraux de chaîne.

Remarque : l'extrait ci-dessus est module augmentation. Les fichiers contenant une extension de module doivent être modules (par opposition à scripts). La différence entre les modules et les scripts est d'avoir au moins une instruction d'importation/exportation.

Pour que TypeScript traite votre fichier en tant que module, ajoutez-lui simplement une instruction d'importation. Cela peut être n'importe quoi. Même import * as ts from 'TypeScript' fera l'affaire.

1
Karol Majewski

Vous pouvez utiliser une Assertion Type pour cela

Parfois, vous vous retrouvez dans une situation où vous en saurez plus sur un valeur que TypeScript fait. Cela se produit généralement lorsque vous connaissez le fichier Le type d'une entité peut être plus spécifique que son type actuel.

Les assertions de type sont un moyen de dire au compilateur «faites-moi confiance, je sais quoi Je le fais. »Une assertion de type ressemble à un transtypage dans d’autres langues, mais n'effectue aucune vérification spéciale ni restructuration des données. Il n'a pas de impact d'exécution, et est utilisé uniquement par le compilateur. TypeScript suppose que vous, le programmeur, avez effectué les vérifications spéciales que vous avez effectuées avoir besoin.

Exemple

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

Vous pouvez également trouver une bibliothèque telle que env-var plus adaptée à cet usage spécifique - 

"solution pour le chargement et la désinfection des variables d'environnement dans node.js avec les typages corrects"

1
Ville

Si vous voulez utiliser .env dans TypeScrype, voici un moyen simple (fonctionne en bash):

1- Créez un fichier .env dans votre application.

2- Configurez vos scripts npm dans le package.json.

3- créer un fichier ./dev.sh dans le répertoire du projet . set -a; source .env; set +a; npm run dev

utilisez le fichier ./dev.sh pour exécuter votre projet.

De cette façon, les variables d'environnement sont définies. Si vous avez défini PORT = 3000 dans le fichier, vous pouvez y accéder en utilisant: process.env.PORT

0
Arman