Typescript добавить свойство в Express Интерфейс запроса - PullRequest
0 голосов
/ 01 февраля 2020

Я хотел бы добавить некоторое свойство "context" в интерфейс запроса Express, чтобы при написании промежуточного программного обеспечения я мог сделать что-то вроде:

const myMiddleware = (req: Request, res: Response, next: NextFunction) => {
  req.context.something = 'something'
  next()
}

Сообщение об ошибке, конечно же, сейчас

Свойство 'context' не существует в типе 'Request'.

Я знаю, что мне нужно выполнить объединение sh объявлений, но не могу понять, что я ' Я делаю неправильно. Я видел некоторые ответы, которые предлагают добавить это в файл .d.ts, поэтому я добавил файл custom.d.ts с этим

export {}
declare global {
    namespace Express {
        interface Request {
            context?: any
        }
    }
}

Мне пришлось добавить export {}, чтобы избежать этой ошибки, но свойство context все еще не может быть найдено.

Аугментации для глобальной области видимости могут быть непосредственно вложены только во внешние модули или объявления окружающих модулей.

Я вижу много решений, предлагающих мне просто расширить интерфейс запроса, но я не хочу этого делать, потому что я хотел бы продолжать использовать тот же интерфейс запроса.

Некоторые решения говорят, что вам нужно добавить typeRoots или files свойство tsconfig. json с людьми, которые говорят, что они получают смешанные результаты, и это не решает мою проблему.

Я также видел предложение использовать модуль express-serve-static-core, который похоже, тоже не работает

declare module 'express-serve-static-core' {
  interface Request {
    context?: any
  }
}

Я знаю, что этот вопрос задавался много раз, но ни один из них не работает для меня, поэтому я думаю, что я делаю что-то не так.

Вот моя файловая структура:

tsconfig.json
src/
  custom.d.ts
  some_folder/
    some_file_that_needs_req.context

и мой цконфиг. json:

{
  "compilerOptions": {
    "outDir": "./dist/",
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "commonjs",
    "target": "es6",
    "allowJs": true
  }
}

1 Ответ

0 голосов
/ 02 февраля 2020

В верхней части моего файла я использовал import * as express from 'express'

Но в своей сигнатуре функции промежуточного программного обеспечения я делал (req: Request, res: Response) вместо (req: express.Request, res: express.Response). В результате я использовал интерфейс запроса lib.dom.d.ts в пакете машинописного текста, а не express интерфейс запроса.

...