← Усі задачіTypeScript · Senior

Параметри маршруту з рядка

Роутери на кшталт React Router і Express описують маршрут рядком: /users/:id/posts/:postId. Напишіть тип RouteParams<Path>, що виводить з такого рядка об'єкт параметрів { id: string; postId: string }, а для маршруту без параметрів дає {}.

З ним функція buildPath(pattern, params) вимагатиме саме ті параметри, що є в маршруті, і підставлятиме їх у шлях, кодуючи значення через encodeURIComponent.

Тести (7)

Тести типів перевіряє компілятор TypeScript у режимі strict. Expect<Equal<A, B>> проходить, коли типи збігаються точно, а // @ts-expect-error - коли наступний рядок не компілюється. Перший запуск завантажує компілятор, тож триває кілька секунд.

  1. типи
    type _ = Expect<Equal<RouteParams<'/users/:id/posts/:postId'>, { id: string; postId: string }>>;
  2. типи
    type _ = Expect<Equal<RouteParams<'/about'>, {}>>;
  3. типи
    buildPath('/users/:id', { id: '42' });
  4. типи
    // @ts-expect-error - postId is missing
    buildPath('/users/:id/posts/:postId', { id: '1' });
  5. expect(buildPath('/users/:id/posts/:postId', { id: '7', postId: '9' })).toBe('/users/7/posts/9');
  6. expect(buildPath('/search/:query', { query: 'a b/c' })).toBe('/search/a%20b%2Fc');
  7. expect(buildPath('/about', {})).toBe('/about');