El tipo de request.query es ParsedQs que tiene la siguiente definición:
interface ParsedQs { [key: string]: undefined | string | string[] | ParsedQs | ParsedQs[] }Mi suposición para cada tipo es la siguiente:
Un valor no está undefined cuando no se menciona en los parámetros.
Por ejemplo: leer request.query.b cuando los parámetros son ?a=1 .
Un valor es una string cuando se menciona una vez en los parámetros. Por ejemplo: leer request.query.a cuando los parámetros son ?a=1 .
Un valor es una string[] cuando se menciona varias veces en los parámetros. Por ejemplo: leer request.query.a cuando los parámetros son ?a=1&a=2 .
Pero, ¿cuándo un valor es un ParsedQs en sí mismo?
La consulta ?a[x]=b&a[y]=c se analiza en {"a":{"x":"b","y":"c"}} .
Y ?a[x]=b&a=c se analiza en {"a":[{"x":"b"},"c"]} .