在 TypeScript 中使用 process.env

新手上路,请多包涵

如何在 TypeScript 中读取节点环境变量?

如果我使用 process.env.NODE_ENV 我有这个错误:

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

我已经安装了 @types/node 但它没有帮助。

原文由 Christophe Le Besnerais 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

无法保证 Node 进程中将提供哪些(如果有的话)环境变量 - NODE_ENV 变量只是 Express 推广的约定,而不是 Node 本身内置的东西。因此,将它包含在类型定义中是没有意义的。相反, 他们定义 process.env 像这样

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

这意味着 process.env 可以用字符串索引以获取字符串(或 undefined ,如果未设置变量)。要修复您的错误,您必须使用索引语法:

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

或者,正如 jcalz 在评论中指出的那样,如果您使用的是 TypeScript 2.2 或更高版本,您可以使用点语法访问上面定义的可索引类型 - 在这种情况下,您的代码应该按原样工作。

原文由 Joe Clay 发布,翻译遵循 CC BY-SA 3.0 许可协议

在项目中安装 @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;
    }
  }
}

// If this file has no import/export statements (i.e. is a script)
// convert it into a module by adding an empty export statement.
export {}

用法:

 process.env.GITHUB_AUTH_TOKEN; // $ExpectType string

此方法将为您提供 IntelliSense,它还利用了字符串文字类型。

注意:上面的代码片段是 _模块扩充_。包含模块扩充的文件必须是 _模块_(而不是 _脚本_)。模块和脚本的区别在于模块至少有一个导入/导出语句。

为了使 TypeScript 将您的文件视为一个模块,只需向其中添加一个 import 语句即可。它可以是任何东西。甚至 export {} 也行。

原文由 Karol Majewski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题