【问题标题】:Add properties to the req object in expressjs with Typescript使用 Typescript 向 expressjs 中的 req 对象添加属性
【发布时间】:2019-06-01 11:41:38
【问题描述】:

我尝试将我的快速服务器代码从 js 迁移到 typescript,并在尝试访问我在自己的中间件函数中添加到请求对象的字段时遇到了问题。

例如,我正在做这样的事情:

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

现在我想稍后在我的其他中间件函数中访问这些属性,但是 @types/express 中的 .d.ts 文件当然为所有中间件函数定义了 req 对象。

现在我想出了两种方法来解决这个问题,但看起来都很糟糕:

  1. 在每个中间件函数中使用类型保护。但后来我在 js 输出中添加了无用的代码,因为我的路由设置方式使我在“编译”时知道我的 req 对象在每个中间件函数中的形状。
  2. 在每个中间件函数中使用类型断言。但是,尽管我编写了代码以便在编译时知道所有类型,但我并没有得到 typescript 的好处,因为那时我基本上禁用了 req 对象的类型检查。

所以我的问题是:如果有的话,我如何在那种情况下使用类型检查?如果我不能,这是否意味着像 express 这样的框架在静态类型语言(如 C#)中是不可能的?

【问题讨论】:

标签: node.js typescript express middleware


【解决方案1】:

您可以使用module augmentation 扩展express 模块中定义的Request 类型

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

【讨论】:

  • 但是我在所有中间件函数中更改了 req 对象的类型,对吗?这个想法是让类型反映中间件函数之间 req 对象的变化形状。这有点完美主义,但我想知道这是否可能。
  • @LeanderBehr 这会很棒,但看起来太有活力了!每个请求都可能有不同的请求类型!
猜你喜欢
  • 2018-12-05
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多