Aller au contenu

Le journal · Développement et ingénierie

Comment définir les types de process.env avec typescript pour avoir de l'auto-complétion

Comment obtenir de l'autocompletion de types en surchargeant un module indépendant ? L'exemple de process.env avec NodeJS et Typescript.

← Le journalMis à jour le 2 min de lecturePar Andréas HANSS

Utiliser la fonction process.env pour consommer des variables d'environnement dans son programme NodeJS est très fréquent, c'est d'ailleurs une bonne pratique des «Twelve-Factor App» — un manifeste pour concevoir des applications qui se mettent à l'échelle automatiquement—.

Par défaut quand vous installez les types ambiants TS de NodeJS (@types/node) dans votre projet javascript, les types de process.env sont définis comme tels :

typescript
interface Process extends EventEmitter {
  emitWarning(warning: string | Error, name?: string, ctor?: Function): void;
  env: ProcessEnv;
  exit(code?: number): never;
}

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

Que faut-il comprendre ici ?

Et bien on voit que l'objet process possède une propriété env de type ProcessEnv (une interface). Cette interface est composée d'un objet ayant des clés sous forme de string et des valeurs string ou non définies.

Super ! Le compilateur typescript ne criera pas si vous tapez process.env.HOST par contre, vous êtes obligés d'aller voir les variables d'environnement injectée pour savoir quelles variables sont disponible à l'utilisation.

Vous en conviendrez : il y a mieux comme expérience de développement.

Typescript permet de surcharger des définitions ambiantes d'un autre module très simplement en utilisant un concept nommé fusion d'interfaces (interfaces merging), grâce à cela nous allons pouvoir définir en amont la représentation des valeurs disponibles dans process.env.

Surcharger les définitions de process dans NodeJS afin d'avoir de l'autocompletion

Dans un fichier que j'appelle modules.d.ts nous allons définir les choses suivantes.

Attention : Ce module doit être dans le scope du projet défini dans le tsconfig afin que le compilateur le trouve et le prenne en compte

typescript
declare namespace NodeJS {
  export interface ProcessEnv {
    HOST: string;
    DB_URL: string;
    DB_NAME?: string;
  }
}

Désormais, votre compilateur et IDE devrait vous proposer de l'autocompletion et une bonne validation.

Pour aller plus loin avec TypeScript, découvrez comment factoriser ses vérifications de types avec asserts ou comment créer une classe final.

La prochaine étape

Et si on donnait forme
à votre idée ?

30 minutes pour parler de votre projet, de vos enjeux et de la suite.

Parlons de votre projet