TypeScript + Express : req.params

11

I have the following express route :

app.get('/:id', function (req, res) {
  var idNum: number = Number(req.params.id);
  var idCast: number = +req.params.id;
  var id: number = req.params.id;

  console.log('typeof idNum ', typeof idNum , '  ', 'idNum== 0 :  ', idNum== 0  , '  ', 'idNum=== 0 :  ', idNum=== 0);
  console.log('typeof idCast', typeof idCast, '  ', 'idCast == 0 :', idCast == 0, '  ', 'idCast === 0 :', idCast === 0);
  console.log('typeof id    ', typeof id    , '  ', 'id == 0 :    ', id == 0    , '  ', 'id === 0 :'    , id === 0);

  res.json({});
});

this returns :

typeof idNum  number    idNum== 0   : true    idNum=== 0   : true
typeof idCast number    idCast == 0 : true    idCast === 0 : true
typeof id     string    id == 0     : true    id === 0     : false

我了解到TypeScript仅提供编译时类型检查,我猜这意味着它不知道req.params提供的参数是字符串。是否有任何方法可以自动将我的参数转换为数字?或者至少在我没有手动完成它时引发错误?否则,除非在完全使用TypeScript的环境中使用,否则它似乎是无用的。
最后,是否有任何“大型”开源项目使用ExpressJS与TypeScript,我可以从中阅读源代码?
2个回答

24

您可以通过使用下面的语法,通过扩展express提供的Request类型来键入req对象:

Request<Params, ResBody, ReqBody, ReqQuery>

因此,在您的示例中,您可以像以下示例一样明确声明属性为传入字符串,以确保将其转换为数字类型:

import { Request } from "express"

...

app.get('/:id', function (req: Request<{ id: string}>, res) {
  
...

8
似乎 req.paramsany,因此编译器无法知道 id 的值是字符串,但当然它作为路径参数始终是字符串。
您可以使用路由中间件来处理它,例如:
router.use(function (req, res, next) {
    if (req.params && req.params.id && typeof req.params.id === "string") {
        let num = Number(req.params.id);
        if (!isNaN(num)) {
            req.params.id = Number(req.params.id);
        }
    }
    next();
});

那应该将所有名为id的参数(它们是字符串)转换为数字。

7
谢谢您的回答,但是对我来说那样做看起来真的很不好 :/ - IggY
2
我怀疑你很难找到更“自动化”的方法。中间件功能正是为了像这种情况而设计的。 - Nitzan Tomer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接