Код 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
  1. Условный тип по значению схемы, затем mapped-тип по ключам.
  2. Не забудь: Number("") это 0, а не NaN.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.