TypeScript Academy · Урок

Объединение литералов в объединения

Создавайте конечные наборы значений, объединяя литеральные типы

Урок 4 из 413 шагов

«Объединение литералов в объединения» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Объединения литеральных типов

Объединение литералов описывает значение, которое должно в точности соответствовать одному из нескольких известных вариантов. Это основа машин состояний (state), перечислений и типизированных программных интерфейсов.

type Status = 'idle' | 'loading' | 'success' | 'error';

let state: Status = 'idle';
state = 'loading';
console.log('State:', state);

Переключение по объединению литералов

Конструкция switch для объединения литералов легко читается, а компилятор знает, что каждый вариант соответствует одному из разрешённых значений. Это идеально сочетается с проверками полноты обработки.

type Status = 'idle' | 'loading' | 'done';

function label(s: Status): string {
  switch (s) {
    case 'idle': return 'Waiting';
    case 'loading': return 'Working';
    case 'done': return 'Finished';
  }
}
console.log(label('loading'));

Полная обработка вариантов

Обработка каждого элемента объединения называется полной обработкой. Если охвачены все варианты, TypeScript может доказать, что функция всегда возвращает результат и ни одна ветвь не пропущена.

type Dir = 'left' | 'right';

function step(d: Dir): number {
  if (d === 'left') return -1;
  return 1; // only 'right' remains
}
console.log(step('left'), step('right'));

Приём с пустым типом для проверки полноты

Присваивание значения типу never в ветви по умолчанию приводит к ошибке компиляции, если Вы добавите новый элемент объединения, но забудете обработать его. Это страховочная сетка для развивающегося кода.

type Shape = 'circle' | 'square';

function area(s: Shape): string {
  switch (s) {
    case 'circle': return 'pi r^2';
    case 'square': return 'a^2';
    default:
      const _exhaustive: never = s;
      return _exhaustive;
  }
}
console.log(area('circle'));

Вывод объединений из константных объектов

Распространённый приём — хранить значения в константном объекте и выводить объединение из его значений с помощью typeof obj[keyof typeof obj]. Один источник истины — два результата.

const Colors = { Red: 'red', Blue: 'blue' } as const;
type Color = typeof Colors[keyof typeof Colors];
// 'red' | 'blue'
const c: Color = Colors.Blue;
console.log(c);

Вывод объединений из ключей

Также можно вывести объединение ключей с помощью keyof typeof obj. Это полезно, когда сами ключи являются значимыми идентификаторами.

const ICONS = { home: 0, search: 1, profile: 2 } as const;
type IconName = keyof typeof ICONS;
// 'home' | 'search' | 'profile'
const name: IconName = 'search';
console.log(name, ICONS[name]);

Дискриминируемые объединения с literal-метками

Добавьте свойство метка с literal-значением к каждому варианту объекта, и TypeScript сможет различать их. Проверка метки сужает тип до точной формы.

type Action =
  | { type: 'add'; amount: number }
  | { type: 'reset' };

function reduce(a: Action): number {
  if (a.type === 'add') return a.amount;
  return 0;
}
console.log(reduce({ type: 'add', amount: 5 }));

Сужение по дискриминатору

После проверки literal-дискриминатора компилятор знает, какой именно вариант у Вас есть, поэтому его уникальные поля становятся безопасно доступными без приведений типов.

type Event =
  | { kind: 'click'; x: number; y: number }
  | { kind: 'key'; code: string };

function handle(e: Event): string {
  if (e.kind === 'key') return 'Key ' + e.code;
  return 'Click ' + e.x + ',' + e.y;
}
console.log(handle({ kind: 'key', code: 'Esc' }));

Объединение нескольких объединений

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

type Primary = 'red' | 'blue' | 'yellow';
type Secondary = 'green' | 'orange';
type Color = Primary | Secondary;

const c: Color = 'green';
console.log(c);

Объединения как ограничения для функций

Передача literal-объединения в функцию ограничивает вызывающий код допустимыми вариантами и предоставляет автодополнение в редакторе. Сочетание безопасности и удобства обнаружения вариантов трудно превзойти.

type Align = 'left' | 'center' | 'right';

function setAlign(a: Align): void {
  console.log('Aligned', a);
}
setAlign('center');
// setAlign('top'); // Error

Почему literal-объединения лучше строк

Параметр обычного типа string принимает любое значение, включая опечатки. Literal-объединение обнаруживает ошибки во время компиляции и документирует допустимые варианты — это заметное улучшение для кода, который легко поддерживать.

type Method = 'GET' | 'POST' | 'PUT' | 'DELETE';

function request(m: Method, url: string): void {
  console.log(m, url);
}
request('POST', '/api/users');

Быстрая проверка

Проверьте, насколько хорошо Вы поняли literal-объединения.

Повторение: объединение литералов

Вы научились:

  • создавать объединения литералов для конечных наборов вариантов;
  • обрабатывать их полностью, используя приём с never для безопасности;
  • выводить объединения из константных объектов с помощью keyof typeof и typeof obj[keyof typeof obj];
  • различать варианты с помощью свойств literal-меток.

Следующий курс посвящён специальным типам unknown, never и void.

const ROUTES = { home: '/', about: '/about' } as const;
type Route = typeof ROUTES[keyof typeof ROUTES];
const r: Route = '/about';
console.log(r);
Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

Часто задаваемые вопросы

Урок «Объединение литералов в объединения» бесплатный?

Да — полный текст урока «Объединение литералов в объединения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Объединение литералов в объединения»?

Создавайте конечные наборы значений, объединяя литеральные типы Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Объединение литералов в объединения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Литеральные типы строк и чисел
  2. Логические литералы и вывод литеральных типов
  3. Утверждения const с помощью as const
  4. Объединение литералов в объединения
← Назад к TypeScript Academy