Я пытаюсь добавить тип защиты, чтобы различать успешные и неудачные вызовы API, где ответ использует один и тот же формат верхнего уровня:
//success
{
statusCode: 200,
result: { foo: 'hello' }
}
//failure
{
statusCode: 300,
result: { errorMessage: 'you broke me' }
}
interface APISuccessResult<T> {
readonly statusCode: number;
result: T;
}
interface APIFailedResult<T> {
readonly statusCode: number;
result: T;
}
type APIResult<T, E> = APISuccessResult<T> | APIFailedResult<E>;
const isAPISuccessResult = <T, E>(result: APIResult<T, E>): result is APISuccessResult<T> => {
return result.statusCode < 300;
};
const isAPIFailedResult = <T, E>(result: APIResult<T, E>): result is APIFailedResult<T> => {
return result.statusCode >= 300;
};
type FooSuccess = {
foo: string;
}
type FooFailure = {
errorMessage: string;
}
const x: APIResult<FooSuccess, FooFailure> = {} as any as APIResult<FooSuccess, FooFailure>;
if (isAPISuccessResult(x)) {
console.log(x.result.foo);
// Property 'foo' does not exist on type 'FooSuccess | FooFailure'
}
Я ожидаю, что этоработает, но это не так ...
Можно ли добавить охрану типа для значения свойства? Я мог видеть проблемы с этим, если значение могло бы измениться, но если это только для чтения, кажется, что это должно быть в порядке. Вот ссылка на игровую площадку , с которой она работает как положено.