Код Middle Условные и mapped-типы обновлено
Парсинг query string в типизированный объект
Условие
Напиши parseQuery<S extends QuerySchema>(qs: string, schema: S): ParsedQuery<S>. Схема: ключ → 'string' | 'number' | 'boolean' | 'string[]'. Тип результата выводится условным типом: 'number' → number | undefined, 'string[]' → string[] (пустой массив, если нет) и т.д.
Правила рантайма: значения декодируются (+ это пробел); number через Number, не число → undefined; boolean: true/1 → true, false/0 → false, иначе undefined; для одиночных типов берётся первое значение; ключи вне схемы игнорируются.
Примеры
demo("?search=red+shoes&page=2&archived=1&tag=a&tag=b") // {"search":"red shoes","page":2,"archived":true,"tags":["a","b"]}
demo("") // {"search":"","page":1,"archived":false,"tags":[]}
demo("page=abc&archived=yes") // {"search":"","page":1,"archived":false,"tags":[]}
Как подойти
Подсказки: 2
- Условный тип по значению схемы, затем mapped-тип по ключам.
- Не забудь:
Number("")это 0, а не NaN.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.