【问题标题】:Typescript: narrowing types with destructuring打字稿:使用解构缩小类型
【发布时间】:2020-05-05 04:01:54
【问题描述】:

以下代码错误:

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,即使他们没有。

【问题讨论】:

  • 您将它与什么 Apollo 类型进行比较? QueryResult 具有类型 ``` 数据:TData |不明确的;错误?:阿波罗错误;加载:布尔值; ```
  • @DamianGreen,看起来就是这样。我很好奇他们如何通过所有示例避免“对象可能是“未定义”
  • 两个变量之间不可能有类型保护。你可以在变量 a 和 b 之间建立一个链接来说明:如果 a ==> b 的条件是别的东西。对于 Apollo React 客户端,我认为 strictNullChecks 已禁用
  • @htn,有道理..这很不幸!如果您将其作为答案提交,我可以接受

标签: typescript react-apollo


【解决方案1】:

不能在 2 个变量之间设置类型保护。您可以在变量 a 和 b 之间建立一个链接来说明:如果满足 a 的条件 ==> b 是别的东西。对于 Apollo React 客户端,我认为 strictNullChecks 是禁用的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2018-06-08
    • 2017-04-10
    • 2021-10-12
    相关资源
    最近更新 更多