Объявите var процесса в глобальном объявлении typescript .d.ts

#node.js #typescript #.d.ts

#node.js #машинописный текст #.d.ts

Вопрос:

Я знаю, что для настройки типов .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: Recordlt;string, stringgt;;  }  } }  

Это дает мне эту ошибку:

 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: Recordlt;string, stringgt;;  }  } }  

Затем ошибки исчезают, но typescript по-прежнему не регистрирует типы введите описание изображения здесь

Ответ №1:

Некоторое время назад у меня была та же проблема. Обращение к моим переменным .env, подобным этому, решило проблему для меня

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

Редактировать

Это то, что я в итоге сделал, в конце концов, это немного лучше, чем мой предыдущий ответ. В глобалах.d.ts:

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

Затем просто ссылайтесь на переменные .env так же, как и раньше, используя точечную нотацию. Вы должны получить intellisense

Когда есть declare global , то код должен быть:

 declare global {  namespace NodeJS {  export interface ProcessEnv {  JWT_SECRET: string;  }  } }  

Комментарии:

1. Я тоже пробовал это, но это небезопасно для печати. Я потратил неделю на отладку кода только для того, чтобы обнаружить, что пытаюсь получить доступ к «JWT_TOKEN_SECRET» вместо «JWT_SECRET». Даже конфигурация, которая, по крайней мере, поможет мне с переменными env автозаполнения, будет работать.

2. @omar попробуйте мой обновленный ответ, возможно, он будет работать немного лучше для вас

3. Попробовал, не получилось. Я нашел правильное решение, основанное на вашем коде. Спасибо, что опубликовали этот фрагмент.