使用Typescript

时间:2019-01-06 16:41:21

标签: node.js typescript express middleware

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

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

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对象的类型检查。

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

1 个答案:

答案 0 :(得分:1)

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

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