typescript - 为什么 bool 值变为真?

标签 typescript

看看下面的code :

export class Smth {
  private flag: boolean;

  public update() {
    this.flag = true;

    this.inner();

    if (this.flag === false) { // Operator '===' cannot be applied to types 'true' and 'false'.
      console.log(123);
    }
  }

  private inner() {
    this.flag = false;
  }
}

我不明白这条线有什么问题

if (this.flag === false)

typescript 说

Operator '===' cannot be applied to types 'true' and 'false'.

但实际上有booleanfalse

我使用的是 typescript 2.6.2,但在线 Playground 显示的结果与 2.7 相同。


它不是 Operator '==' cannot be applied to types x and y in Typescript 2 的副本因为这个问题是关于比较常量的。但在我的代码中,它是一个可更改的类字段,并且有一个函数可以更改值。而且,它被称为。

this.flag = true;

this.inner(); // exectues this.flag = false;

if (this.flag === false) { // ... types 'true' and 'false'. - WHY?

最佳答案

TypeScript 有点聪明,因为它对您的方法进行了静态分析,并且它会发现除了 false 之外,您从未分配任何东西,至少在这个闭包或上下文中 - 使类型定义假定您的变量类型为 false 而不是 boolean。它不会查找内部调用方法的变化。

将定义想象成是这样全局声明的:

export type boolean = true | false

false只是false,没有true

有几种解决方法:

  1. 从一开始就在类声明中分配类型,如下所示:

    class MyClass {
      private flag: boolean = true
      ...
    }
    
  2. 只是不要测试直接相等性,单独使用 bool 值:

    if (!this.flag) // instead of this.flag === false
    

关于typescript - 为什么 bool 值变为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48626568/

相关文章:

Typescript - 在参数中排除其他类型的键

angular - 在 Promise 链中使用 `.setTimeout()` 的正确方法是什么?

css - 在运行时将 css 类添加到传单层

javascript - 我的 .ts 代码中显示错误 > [ts] 类型 'name' 上不存在属性 'any[]'

typescript - 如何有条件地检测 TypeScript 中的 `any` 类型?

angularjs - 使用 TypeScript 创建自定义 Angular 过滤器

javascript - 如何将数据传递给 Modal ionic 2

javascript - Vue 模型绑定(bind)为数字

typescript - 为什么不将变量值注入(inject)到模板字符串中?

javascript - RxJS zip 和管道组合不起作用