#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. Попробовал, не получилось. Я нашел правильное решение, основанное на вашем коде. Спасибо, что опубликовали этот фрагмент.