type ParseQueryString<S extends string> = S extends `${infer Key}=${infer Value}&${infer Rest}`
? {
[K in UnescapeKey<Key>]: UnescapeValue<Value>;
} & ParseQueryString<Rest>
: S extends `${infer Key}=${infer Value}`
? {
[K in UnescapeKey<Key>]: UnescapeValue<Value>;
}
: {};
type UnescapeKey<S extends string> = S extends `${infer Head}%${infer Code}${infer Tail}`
? `${Head}${DecodeURIComponent('%' + Code) extends infer U ? U : ''}${UnescapeKey<Tail>}`
: S;
type UnescapeValue<S extends string> = S extends `${infer Head}%${infer Code}${infer Tail}`
? `${Head}${DecodeURIComponent('%' + Code) extends infer U ? U : ''}${UnescapeValue<Tail>}`
: S;