看看下面的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'.
但实际上有boolean
和false
。
我使用的是 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
。
有几种解决方法:
从一开始就在类声明中分配类型,如下所示:
class MyClass { private flag: boolean = true ... }
只是不要测试直接相等性,单独使用 bool 值:
if (!this.flag) // instead of this.flag === false
关于typescript - 为什么 bool 值变为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48626568/