I noticed that the type of query parameters in req.query is
string | string[] | QueryString.ParsedQS | QueryString.ParsedQS[]
but so far, whenever i used req.query i always got strings.
My questions are
The type string | string[] | QueryString.ParsedQS | QueryString.ParsedQS[] is the type returned by qs.parse() method, take a look here at the declaration file: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/qs/index.d.ts#L57.
Take a look at the qs documentation for possible return values of qs.parse():
https://github.com/ljharb/qs
For req.query to be parsed from string to object you need to call express app.set('query parser', 'extended'), extended is the default value but you may have changed it in your code:
https://expressjs.com/en/api.html#app.set