Что такое дискриминированные объединения (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 получаем гарантию, что все варианты обработаны.