Код Senior Условные и mapped-типы обновлено
buildPath: параметры маршрута из шаблонной строки
Условие
Напиши тип RouteParams<P>, который из шаблона маршрута '/users/:id/posts/:postId' выводит { id: string | number; postId: string | number } (для маршрута без параметров пустой объект {}), и функцию buildPath<P extends string>(pattern: P, params: RouteParams<P>): string, которая подставляет значения, кодируя их через encodeURIComponent. Отсутствующий параметр это ошибка компиляции, а в рантайме Error('missing param: <имя>').
demo в заготовке собирает несколько путей.
Примеры
demo(7, "hello") // ["/users/7", "/users/7/posts/hello", "/health"]
demo(1, "привет мир") // ["/users/1", "/users/1/posts/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80", "/health"]
demo(0, "a/b") // ["/users/0", "/users/0/posts/a%2Fb", "/health"]
Как подойти
Тип: рекурсивный разбор template literal. Рантайм: replace по регулярке.
Подсказки: 2
- Рекурсивный условный тип: отрезай
:имядо следующего/и рекурсивно разбирай остаток. - Mapped-тип по объединению имён даёт объект с этими ключами; объединение
neverдаёт{}.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.