Тип защиты на значение только для чтения - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь добавить тип защиты, чтобы различать успешные и неудачные вызовы 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'
}

Я ожидаю, что этоработает, но это не так ...

Можно ли добавить охрану типа для значения свойства? Я мог видеть проблемы с этим, если значение могло бы измениться, но если это только для чтения, кажется, что это должно быть в порядке. Вот ссылка на игровую площадку , с которой она работает как положено.

...