Как в TypeScript описать состояние запроса, в котором поле `data` существует только при статусе `success`, а при `loading` или `error` недоступно?

Используйте discriminated union по полю status: data объявляется только в варианте success.

Короткий ответ

Что ответить на собеседовании

Используйте discriminated union по полю status: data объявляется только в варианте success.

Подробный разбор

Ответ с пояснениями

Используйте discriminated union по полю status: data объявляется только в варианте success.

Пример:

type RequestState<T> =
  | { status: 'loading' }
  | { status: 'error'; error: string }
  | { status: 'success'; data: T };
function read<T>(state: RequestState<T>) {
  if (state.status === 'success') return state.data;
  return undefined;
}

После проверки status TypeScript сужает вариант. Поле data?: T в одном общем интерфейсе не выражает такую же строгую связь между статусом и данными.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее