Перейти к содержимому

Template Literal Types

TS 4.1+: можно строить и парсить строковые литералы на уровне типов. На интервью спрашивают про Capitalize/Uncapitalize/Uppercase/Lowercase, написать тип event-имён ‘on${Capitalize<K>}’, разобрать URL по сегментам.

Конкатенация и intrinsic-типы:

type Lang = 'en' | 'ru';
type Page = 'home' | 'about';
type Url = `/${Lang}/${Page}`;
// '/en/home' | '/en/about' | '/ru/home' | '/ru/about'
type EventName&lt;K extends string&gt; = `on${Capitalize&lt;K&gt;}`;
type E = EventName&lt;'click' | 'hover'&gt;; // 'onClick' | 'onHover'
type Lower = Lowercase&lt;'HELLO'&gt;; // 'hello'

Парсинг через infer + template literal:

// Разбор 'GET /users/:id' в { method, path }
type Parse&lt;S&gt; =
S extends `${infer M} ${infer P}` ? { method: M; path: P } : never;
type Route = Parse&lt;'GET /users/:id'&gt;; // { method: 'GET'; path: '/users/:id' }
// Извлечение параметров маршрута
type Params&lt;P extends string&gt; =
P extends `${string}:${infer Param}/${infer Rest}` ? Param | Params&lt;`/${Rest}`&gt; :
P extends `${string}:${infer Param}` ? Param : never;
type R1 = Params&lt;'/users/:id/posts/:postId'&gt;; // 'id' | 'postId'

Итог: Template literal types + infer = парсинг и генерация строк на уровне типов; intrinsic-обёртки покрывают регистр.