首页 > 解决方案 > 使用 Typescript 向 expressjs 中的 req 对象添加属性

问题描述

我尝试将我的快速服务器代码从 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. 在每个中间件函数中使用 typeguard。但是后来我在 js 输出中添加了无用的代码,因为我的路由设置方式使我在“编译”时知道我的 req 对象在每个中间件函数中的形状。
  2. 在每个中间件函数中使用类型断言。但是,尽管我编写了代码以便在编译时知道所有类型,但我并没有得到打字稿的好处,因为那时我基本上禁用了 req 对象的类型检查。

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

标签: node.jstypescriptexpressmiddleware

解决方案


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

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

推荐阅读