【问题标题】:Discriminated unions with boolean带布尔值的可区分联合
【发布时间】:2020-05-07 18:22:26
【问题描述】:

问题

布尔类型的判别联合似乎只适用于真正的关联类型。

复制者

interface DummyA {
  hint: true
  a: string
}

interface DummyB {
  hint: false
  b: string
}

type Dummy =
  | DummyA
  | DummyB;

const dummies: Dummy[] = [
  {
    hint: true,
    a: "a"
  },
  {
    hint: false,
    b: "b"
  }
]

dummies.forEach(value => {
  if (value.hint) {
    value.a
  } else {
    value.b
  }
})

预期结果

如果它适用于 true,它应该适用于 false。这是正常行为,还是更像一个问题?

【问题讨论】:

  • 它按预期工作。你有什么问题?
  • 这适用于严格的空检查
  • 好吧,事实上,使用 value.hint === true,它可以工作。正如@TitianCernicova-Dragomir 所说,它与非严格的空检查有关!谢谢。我猜如果没有这些检查,条件类型必须为 null |布尔值,然后 if 不能为 else 因为它可能为空。

标签: typescript


【解决方案1】:

如果您使用strictNullChecks,这将按预期工作。如果您不使用严格的空检查(我怀疑根据您的问题),如果您使用 === true


dummies.forEach(value => {
  if (value.hint === true) {
    value.a
  } else {
    value.b
  }
})

Playground Link

【讨论】:

  • 如果不需要 strictNullChecks,为什么还需要 === true?如果编译器担心hint可能没有被定义,那么检查value.hint不就足够了吗?
猜你喜欢
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 2018-11-24
  • 2011-03-10
相关资源
最近更新 更多