Код 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
  1. Рекурсивный условный тип: отрезай :имя до следующего / и рекурсивно разбирай остаток.
  2. Mapped-тип по объединению имён даёт объект с этими ключами; объединение never даёт {}.

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

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