Добавьте свойства к объекту req в expressjs с Typescript - PullRequest
0 голосов
/ 06 января 2019

Я попытался перенести код моего экспресс-сервера с js на машинопись и столкнулся с проблемами при попытке доступа к полям, которые я добавил к объекту запроса в моих собственных функциях промежуточного программного обеспечения.

Например, я делаю что-то вроде этого:

app.use((req, res, next) => {
    let account = checkAuthentication(req);
    if(account) {
        req.authenticated = true;
        req.account = account;
        next();
    }
});

Теперь я хочу получить доступ к этим свойствам позже в других моих функциях промежуточного программного обеспечения, но файл .d.ts из @ types / express определенно определяет объект req для всех функций промежуточного программного обеспечения.

Теперь я нашел два способа справиться с этим, но оба кажутся плохими:

  1. Используйте typeguard в каждой функции промежуточного программного обеспечения. Но затем я добавляю бесполезный код в вывод js, потому что мои маршруты настроены таким образом, чтобы я знал во время «компиляции», какую форму мой объект req имеет в каждой функции промежуточного программного обеспечения.
  2. Используйте утверждение типа в каждой функции промежуточного программного обеспечения. Но тогда я не получаю преимуществ от typcript, несмотря на написание своего кода, чтобы все типы были известны во время компиляции, потому что тогда я в основном отключаю проверку типов для объекта req.

Итак, мой вопрос: как, если вообще, я могу использовать проверку типов в этом сценарии? Если я не могу, значит ли это, что такая структура, как express, невозможна в статически типизированном языке (например, C #)?

1 Ответ

0 голосов
/ 06 января 2019

Вы можете использовать расширение модуля для расширения типа Request, определенного в модуле express

declare global {
    namespace Express {
         export interface Request {
              account: Account;
              authenticaticated: boolean 
         }
    }
}
...