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
I understand that typescript provide only compile-time type-checking, and I guess it means it's not aware that req.params provide arguments as strings.
Is there any way I can automatically cast my params to Number ? or at least raise an error of I didn't done it manually ? Else, it seems that tympescript, unless used in a full-typescript environnement is useless.
Endly, is there any "big" open source project using TypeScript with ExpressJS that I could read the source from ?
You can type the req object by extending the Request type provided by express with the following syntax:
Request<Params, ResBody, ReqBody, ReqQuery>
Therefore, in your example, you could do something like the following to explicitly declare that your property is an incoming string to ensure you convert it to a Number type:
import { Request } from "express"
...
app.get('/:id', function (req: Request<{ id: string}>, res) {
  
...
                        It seems that the req.params is any so the compiler has no way of knowing that the value for id is string, BUT of course it's a string as it comes as a path param which are always strings.
You should be able to deal with it using a router middleware, something like:
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();
});
That should convert all params named id (which are strings) into numbers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With