Вопрос проверяет понимание дискриминантных объединений (discriminated unions) в TypeScript, которые позволяют создавать типобезопасные структуры с общей строковой меткой.
Дискриминантные юнионы (discriminated unions) — это мощный паттерн в TypeScript, который объединяет несколько типов в один союз, где каждый тип имеет уникальное литеральное поле-дискриминант. Это поле позволяет TypeScript автоматически сужать тип при проверке, обеспечивая безопасность и читаемость кода.
Представьте, что у вас есть несколько вариантов состояния запроса: загрузка, успех и ошибка. Каждый вариант имеет общее поле status с уникальным строковым значением. TypeScript использует это поле, чтобы понять, какой именно тип используется в данный момент.
type LoadingState = { status: 'loading'; progress: number };
type SuccessState = { status: 'success'; data: string };
type ErrorState = { status: 'error'; error: string };
type State = LoadingState | SuccessState | ErrorState;
function handleState(state: State) {
if (state.status === 'loading') {
console.log(state.progress); // только LoadingState
} else if (state.status === 'success') {
console.log(state.data); // только SuccessState
} else {
console.log(state.error); // только ErrorState
}
}Этот паттерн часто используется в Redux (редьюсеры с разными action types), обработке API-ответов, формах с разными состояниями и в любых сценариях, где нужно безопасно работать с несколькими вариантами данных.
Дискриминантные юнионы делают код более предсказуемым и уменьшают количество ошибок, связанных с неправильной обработкой типов. Их стоит применять везде, где есть несколько взаимоисключающих состояний или вариантов данных.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию