打字稿:通过解构缩小类型

时间:2020-05-04 19:35:48

标签: typescript react-apollo

以下代码错误:

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 个答案:

答案 0 :(得分:1)

两个变量之间不能有类型保护。您可以在变量a和b之间建立链接,以告知:如果满足a的条件==> b则是另一回事。对于Apollo React客户端,我认为strictNullChecks已禁用