【问题标题】:Why aren't booleans acting like booleans?为什么布尔值不像布尔值?
【发布时间】:2020-06-09 20:59:23
【问题描述】:

使用 TypeScript 3.9.5 我遇到了 TS 错误:

TS2365:运算符 '!==' 不能应用于类型 'false' 和 'true'

简化示例(代码不做任何事情,但代表实际功能的流程):

function _huh() {
  let allStatementsMatched = true
  let invoiceIIDsToApply = []

  if (_.isEmpty(invoiceIIDsToApply) === false) {
    invoiceIIDsToApply.forEach(x => {
      if (x.name === 'test') {
        allStatementsMatched = false
      } 
    })

    //  Why does the below statement result in error: TS2365?
    if (allStatementsMatched === false) {

    }
  } 
}

我发现 several github 问题正在讨论这个问题,但它们都处理更复杂的场景,我无法看到它们如何应用于我的非常简单的示例。

为什么打字稿不处理boolean like a boolean? “真”和“假”从何而来?

【问题讨论】:

  • 我不确定为什么 typescript 在这里给出可疑的控制流分析,但需要注意的是,直接将布尔值与另一个布尔值进行比较是一种不好的形式。只需改用if (!allStatemetsMatched),它不仅读起来更好,而且还消除了这个错误。

标签: typescript


【解决方案1】:

这发生在我之前,但只有当我(错误地)做了这样的事情时:

let x: true;
let y: false;
if (x === false) {
  //...whatever...
}

正如您在 sn-p 中看到的,我将 xy 声明为 truefalse 类型的变量,而不是像下面这样分配值:

let x = true;
let y = false;
if (x === false) {
  //...whatever...
}

确保您没有犯同样的错误。有时这种愚蠢的错误很难发现。

【讨论】:

  • 感谢您的回答,但不适用于我的情况。即使我声明 allStatementsMatched: boolean = true 我也会遇到同样的错误。
【解决方案2】:

I put your code in sandbox and I got

此条件将始终返回 'false',因为类型 'true' 和 'false' 没有重叠

没什么大不了的,typescript 再次以其出色的流控制分析试图超越我。

let allStatementsMatched: boolean = true;

显然这没有帮助。就这个变量的作用域而言,这很奇怪。

let allStatementsMatched = true as boolean;

看起来true/false 不尊重显式类型声明,您必须强制转换它们才能使其工作。

【讨论】:

  • 奇怪的是它似乎不相信foreach 可以改变allStatementsMatched 的状态;如果我将allStatementsMatched = false 放在foreach 之外,它就知道allStatementsMatched 可以是`false。对我来说似乎是一个错误
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 2013-04-01
  • 2022-11-08
  • 2020-03-21
  • 1970-01-01
  • 2022-12-09
  • 2017-04-08
  • 2013-04-26
相关资源
最近更新 更多