Машинопись: сужение типов с деструктуризацией - PullRequest
1 голос
/ 04 мая 2020

Следующие ошибки кода:

type Foo = {
  a: true,
  b: null,
  c: null
} | {
  a: false,
  b: Error,
  c: null
} | {
  a: false,
  b: null,
  c: { prop: number}
}

function getFoo(): Foo {

  return { a: false, b: null, c: { prop: 5 } };

}

const { a, b, c } = getFoo();

if (!a && !b) {
  console.log(c.prop)
}

Приведенная ошибка:

Object is possibly 'null'.(2531)

Это имеет некоторый смысл, потому что, когда результат из getFoo() был деструктурирован, типы из более крупный объект Foo был потерян.

Однако я пытаюсь воспроизвести то, что делает клиент Apollo React:

const { loading, error, data } = useQuery('...');

if (loading) {
  return '..';
}
if (error) {
  return '..';
}
return data.foo;

Мне трудно понять, из их источник, как они это делают.

Это вообще возможно в Typescript? Я предполагаю, что их типы могут быть неточными на 100%, и они говорят, что всегда возвращают data, даже если это не так.

1 Ответ

1 голос
/ 04 мая 2020

Невозможно установить защиту типа между двумя переменными. Вы можете связать переменную a и b, чтобы указать, что: если условие a выполнено ==> b - это что-то еще. Для клиента Apollo React я думаю, что strictNullChecks отключен

...