在全局声明 typescript .d.ts 中声明进程变量

Posted

技术标签:

【中文标题】在全局声明 typescript .d.ts 中声明进程变量【英文标题】:Declare process var in global declare typescript .d.ts 【发布时间】:2022-01-15 15:22:32 【问题描述】:

我知道设置 .env 类型,我们在 .d.ts 中编写这段代码:

  var process: 
   env: 
      MONGO_DB_URL: string;
    
  

但是如果我在全局声明中这样做,像这样:

declare global 
  var process: 
   env: 
      MONGO_DB_URL: string;
    
  
  module Express 
    export interface Request 
      decodedToken: DecodedToken;
    
    export interface Application 
      io: Server;
      sessionQIDtoSocketMap: Record<string, string>;
    
  

它给了我这个错误:

var process: globalThis.NodeJS.Process
Subsequent variable declarations must have the same type.  Variable 'process' must be of type 'Process', but here has type ' env:  MONGO_DB_URL: string; ; '.ts(2403)
globals.d.ts(44, 13): 'process' was also declared here.

如果我这样做:

declare var process: 
  env: 
    MONGO_DB_URL: string;
  ;
;
declare global 
  module Express 
    export interface Request 
      decodedToken: DecodedToken;
    
    export interface Application 
      io: Server;
      sessionQIDtoSocketMap: Record<string, string>;
    
  

错误然后消失,但打字稿仍然没有注册类型

【问题讨论】:

【参考方案1】:

不久前我遇到了同样的问题。像这样引用我的 .env 变量解决了我的问题

const MONGODB_URL = process.env["MONGO_DB_URL"];

编辑

这就是我最终做的,比我之前的答案略好。在 globals.d.ts 中:

declare namespace NodeJS 
  interface ProcessEnv 
   MONGO_DB_URL: string
   //etc...
  

然后只引用 .env 变量,就像使用点符号之前一样。你应该得到智能感知

如果有declare global,那么代码应该是:

declare global 
  namespace NodeJS 
    export interface ProcessEnv 
      JWT_SECRET: string;
    
  

【讨论】:

我也试过这个,但它不是类型安全的。我花了一周时间调试代码只是为了发现我试图访问“JWT_TOKEN_SECRET”而不是“JWT_SECRET”。即使是至少可以帮助我自动完成环境变量的配置也可以工作。 @omar 试试我更新后的答案,可能对你更有效 试过了,没用。我根据您的代码找到了正确的解决方案。感谢您发布此 sn-p。

以上是关于在全局声明 typescript .d.ts 中声明进程变量的主要内容,如果未能解决你的问题,请参考以下文章

Typescript 中的“声明全局”是啥?

如何在 TypeScript 中声明一个全局变量并在 Vue 中使用它

如何添加自定义 TypeScript 全局接口

使用 TypeScript 声明 (*.d.ts) 和接口的正确方法?

Typescript 生成带有 `#private;` 字段的声明 d.ts 文件

获取TypeScript的声明文件.d.ts