带有自定义预期字段的 Express 路由器请求

时间:2021-03-22 12:01:45

标签: typescript express typescript-declarations

我正在将基于 JS 的 express 应用程序重写为 Typescript。在重构路由器实例时,我偶然发现了以下问题:

this.router.get('/tenantInfo', (req, res) => {
  res.send(this.getTentantInfo(req.tenant))
})

当我想将其转换为 Typescript 时,它看起来像这样:

import express, { Request, Response, Router } from 'express'

this.router.get('/tenantInfo', (req: Request, res: Response) => {
  res.send(this.getTentantInfo(req.tenant))
})

导致 req.tenant 出错,因为 Request 没有这个属性。我搜索了 Stackoverflow 并找到了 this answer,但是,我认为如果我只是使用每个和 每个附加属性Request 接口,这不会导致良好的应用程序结构> 我希望在我的应用程序的各个地方

以干净且可维护的方式解决此问题的好方法是什么?

2 个答案:

答案 0 :(得分:0)

您可能需要在使用前检查 tenant,例如:

this.router.get('/tenantInfo', (req: Request, res: Response) => {
  if(req.tenant){
      res.send(this.getTentantInfo(req.tenant))
  }

  res.send({
     message: "Your error message..."      
  })
})

我不确定,但测试一下,看看它是否能解决您的问题

答案 1 :(得分:0)

这可能不会增加我的评论,但您也可以将 .d.ts 文件分隔到多个位置。假设你有这个目录结构

.
└── src
    ├── tenant
    │   ├── request.d.ts
    │   └── routes.ts
    ├── some
    │   ├── interface.ts
    │   ├── some.d.ts
    │   └── routes.ts
    ├── other
    │   └── ...
    └── stuff
        └── ...

tenant/request.d.ts

declare namespace Express {
  interface Request {
    tenant?: string;
  }
}

some/interface.ts

export interface Some {
  foo: string;
  bar: string;
}

并在some/request.d.ts

import { Some } from "./interfaces"; 

declare namespace Express {
  interface Request {
    some?: Some;
  }
}

同样适用于 otherstuff...