Website-Suche

node.js - Erweiterung der process.env-Variablentypen in Nodejs mit Typescript


Also habe ich eine Logik, die je nach der NODE_ENV, in der ich mich befinde, unterschiedliche baseURLs setzt.

Mein Problem ist, dass process.env.NODE_ENV nur zwei Typen hat, development und production, und ich auch die Option für staging haben möchte.

Also habe ich versucht, eine Datei namens environment.d.ts im Stammordner meines Projekts zu erstellen, und darin habe ich Folgendes gemacht:

declare namespace NodeJS {
  export interface ProcessEnv {
    NODE_ENV: "development" | "production" | "staging";
  }
}

Ich erhalte jedoch immer noch den Fehler, wenn ich versuche, staging zu verwenden:

This condition will always return 'false' since the types '"production"' and '"staging"' have no overlap.ts(2367)
export const baseURL =
  process.env.NODE_ENV === "development"
    ? "http://localhost:3000"
    : process.env.NODE_ENV === "staging"
    ? `https://ego-stage.herokuapp.com/`
    : process.env.NODE_ENV === "production"
    ? "https://egolounge.com/"
    : "http://localhost:3000";

Die Zeile, die mir den Fehler gibt, ist die Zeile, in der ich vergleiche, ob NODE_ENV gleich staging ist, da staging als Typ in der Standard-Schnittstelle für NODE_ENV nicht vorhanden ist. Deshalb muss ich sie mit meiner eigenen Definition erweitern, aber die Definition, die ich erstellt habe, ersetzt aus irgendeinem Grund die Standarddefinition nicht, und wenn ich auf den Server pushe, wird es nicht gebaut.

Antwort #1

Es ist mir gelungen, genau das zu tun, was du wolltest, indem ich einen anderen Dateinamen verwendet und alle Exporte weggelassen habe.

// <project_root>/index.d.ts
declare namespace NodeJS {
  interface ProcessEnv {
     NODE_ENV: 'dev' | 'stg' | 'prod';
  }
}

Ich habe einfach die akzeptierten Werte für NODE_ENV abgekürzt, da ich nur die Schnittstelle mit anderen Werten erweitern wollte, die ich in meiner .env-Datei habe.

Ich habe festgestellt, dass das export interface nichts Zusätzliches getan hat, um das ProcesEnv-Interface zu erweitern.

Ich denke, wenn du den Namen der Datei ändern willst, musst du trotzdem die index.d.ts einfügen und mit einem Import referenzieren (oder diesem seltsamen dreifachen Schrägstrich).

Oder du musst es zu den Includes in deiner tsconfig.json-Datei hinzufügen. Will jemand das für mich überprüfen?

Verwandte Artikel