【问题标题】:How to quickly discriminate between interfaces with non-overlapping properties如何快速区分具有非重叠属性的接口
【发布时间】:2019-07-09 11:09:40
【问题描述】:

在打字稿中,我通常有一个类型如下的变量:

const variable: { a: string } | { b: number };

当我想检查变量的形状时,我通常想做

if (variable.a !== undefined) {
  // do stuff
}
else {
  // do stuff

但是在严格模式下,typescript 会在 variable.a 处引发类型错误,因为不知道 variable 具有属性 a。为了解决这个问题,我通常会转换为any,例如(variable as any).a !== undefined。但是 typescript 不会将其视为类型保护,也不会缩小 variable 的类型。

在严格模式下(不制作自定义类型保护)是否有“正确”的方式在 typescript 中执行此检查?

我尝试过的一些示例(不幸的是,它们也会引发类型错误):

  • typeof variable.a !== 'undefined'
  • variable.hasOwnProperty('a')

【问题讨论】:

  • @tehhowch 虽然我的问题的答案可能与该问题的答案相同,但这两个问题引入了非常不同的场景。在那个问题中,发帖者已经知道他们想要做什么(在这种情况下,使用in 运算符)。在这个问题中,发帖人不知道他们想要做什么。我认为寻找 this 问题答案的人不会找到 that 问题(我当然没有)。

标签: typescript strict type-deduction


【解决方案1】:

在这种情况下,最简单的区分方法是 in 类型保护:

declare const variable: { a: string } | { b: number };


if ('a' in variable) {
    variable.a
}
else {
    variable.b
}

【讨论】:

  • 谢谢!!我一直在做骇人听闻的变通办法,我突然想到要搜索 S.O.寻求更好的解决方案——但我真的没想到会有一个。这让我很开心!
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2020-06-10
相关资源
最近更新 更多