PassFront
  1. PassFront
  2. База знаний
  3. Type Narrowing и Guards

Что такое дискриминированные объединения (discriminated unions) в TypeScript?

Type Narrowing и Guards

Дискриминированное объединение — union объектных типов с общим полем-литералом, по которому TypeScript однозначно определяет, какой вариант перед ним.

Пример

type Result =
  | { status: 'loading' }
  | { status: 'success'; data: string[] }
  | { status: 'error'; message: string };

function render(r: Result) {
  switch (r.status) {
    case 'loading': return 'Загрузка...';
    case 'success': return r.data.join(', ');   // доступен data
    case 'error':   return r.message;           // доступен message
  }
}

Проверка полноты

Чтобы компилятор указал на забытый вариант, добавляют ветку с never:

default: {
  const _exhaustive: never = r;
  return _exhaustive;
}

При добавлении нового значения status код перестанет компилироваться, пока ветка не будет обработана.

Где применяют

Состояния запросов, события в редьюсерах, ответы API, конечные автоматы.

Коротко для собеседования

Общее поле-литерал позволяет сузить тип в switch. Вместе с never получаем гарантию, что все варианты обработаны.

Другие вопросы раздела