Опишите ответ как union взаимоисключающих ветвей и выведите возвращаемое значение условным типом из конкретного входного типа.
Решите задачу TypeScript: есть тип Response с взаимоисключающими полями payload и error, причём их типы могут отличаться. Нужно типизировать функции payloadFrom(response), возвращающую payload или undefined, и errorFrom(response), возвращающую error или undefined, чтобы возвращаемые типы выводились автоматически из входного Response.
Опишите ответ как union взаимоисключающих ветвей и выведите возвращаемое значение условным типом из конкретного входного типа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Решите задачу TypeScript: есть тип Response с взаимоисключающими полями payload и error, причём их типы могут отличаться. Нужно типизировать функции payloadFrom(response), возвращающую payload или undefined, и errorFrom(response), возвращающую error или undefined, чтобы возвращаемые типы выводились автоматически из входного Response.
Ответ
Опишите ответ как union взаимоисключающих ветвей и выведите возвращаемое значение условным типом из конкретного входного типа.
Пример модуля, не конфликтующего с глобальным DOM Response:
export type Response<P, E> =
| { payload: P; error?: never }
| { error: E; payload?: never };
type PayloadOf<R> = R extends { payload: infer P } ? P : undefined;
type ErrorOf<R> = R extends { error: infer E } ? E : undefined;
export function payloadFrom<R extends Response<unknown, unknown>>(r: R): PayloadOf<R> {
return r.payload as PayloadOf<R>;
}
export function errorFrom<R extends Response<unknown, unknown>>(r: R): ErrorOf<R> {
return r.error as ErrorOf<R>;
}
const value = payloadFrom({ payload: 42 }); // number
const absent = payloadFrom({ error: 'failed' }); // undefined
Условные типы распределяются по union: для обеих возможных ветвей результат включает undefined. Локальные assertions связывают реализацию с контрактом, но не валидируют внешний JSON.