TypeScript долгое время позволял описывать литеральные типы для отдельных строковых или числовых значений, однако с появлением шаблонных литералов появилась потребность в типизации конкретных шаблонов строк. Template Literal Types добавляют возможность описывать типы, основанные на шаблонном соединении строк, что обеспечивает статическую валидацию структуры строковых значений.
Проверить соответствие строки определенному формату (например, 'user_42') средствами обычных string-типов невозможно — они слишком общие. Без шаблонных типов компилятор не может гарантировать, что строка будет подходить под строго заданный паттерн.
Template Literal Types позволяют формировать сложные строковые типы на этапе компиляции и обеспечивать строгую проверку их соответствия определенным шаблонам.
Пример кода:
type UserId = `user_${number}`; function loadUser(id: UserId) { // ... } loadUser('user_123'); // корректно loadUser('admin_123'); // ошибка компиляции
Ключевые особенности:
Можно ли использовать Template Literal Types только с number/literal? Можно ли использовать свои строковые литералы в шаблоне?
Можно использовать любые литеральные типы — строки, числа, объединения:
type EventType = `event_${'click' | 'hover'}`; // event_click | event_hover
Можно ли передать обычную строку, если функция ожидает тип Template Literal?
Нет, если тип явно ожидает литерал-шаблон, просто string не подойдет:
function handler(type: `btn_${string}`) {} handler('btn_click'); // ок handler('button'); // ошибка компиляции
Работают ли шаблонные строковые типы с mapped types и keyof?
Да, Template Literal Types отлично комбинируются с mapped types и ключами объектов:
const colors = {red: 1, blue: 2}; type ColorKey = keyof typeof colors; type ColorClass = `color-${ColorKey}`; // color-red | color-blue
API принимает идентификаторы вида 'user_XXX', функция не типизирована — возможно подать любую строку, при ошибке на сервере возникают баги.
Плюсы:
Минусы:
Используется тип UserId = user_${number}, перед компиляцией гарантируется корректность аргументов функций и безопасные запросы к серверу.
Плюсы:
Минусы: