Typescript未检测到方法正在更改的属性

Typescript未检测到方法正在更改的属性,typescript,Typescript,因此,我有以下代码: A类{ 构造函数(private num:number=1){ } 私有changeNum(){ this.num=Math.random(); } 私人秘书长(){ 如果(this.num==1){ this.changeNum(); 如果(this.num==0.5){ //做事 } } } } 它是一个类,它有一个属性num和一个函数changeNum,可以更改该数字 然后,它还有另一个函数fn,它首先检查num是否等于1,如果等于1,则通过changeNum更改n

因此,我有以下代码:

A类{
构造函数(private num:number=1){
}
私有changeNum(){
this.num=Math.random();
}
私人秘书长(){
如果(this.num==1){
this.changeNum();
如果(this.num==0.5){
//做事
}
}
}
}
它是一个类,它有一个属性
num
和一个函数
changeNum
,可以更改该数字

然后,它还有另一个函数
fn
,它首先检查
num
是否等于1,如果等于1,则通过
changeNum
更改
num
,然后再次检查

问题是Typescript没有检测到num是通过
changeNum
更改的,并抛出以下错误:

此条件将始终返回“false”,因为类型“1”和“0.5”没有重叠。

有没有办法让Typescript识别
num
是通过
changeNum
更改的


编辑:我发现将
if(this.num==0.5)
更改为
if(this.num==Number(0.5))
可以使程序正确编译,但这显然不是一个好的解决方案

这是控制流分析的已知问题

主要问题是:当调用函数时,我们应该假设它的副作用是什么

一种选择是悲观并重置所有狭窄,假设任何函数都可能变异它可能得到的任何对象。另一种选择是保持乐观,并假设函数不修改任何状态。这两种情况似乎都不好。(增加重点)

TypeScript采用乐观的方法,并假设函数只修改自己的状态。这就提出了一个解决方法:不要在函数或方法中改变外部状态。例如,您可以像这样重写演示:

class A {
  constructor(private num: number = 1) { }

  private getNewNum() {
    return Math.random();
  }

  private fn() {
    if (this.num === 1) {
      this.num = this.getNewNum();
        if (this.num === 0.5) {
          // do stuff
        }
    }
  }
}
结果是,您的程序将执行。

GetNewNum()不是一个纯函数。当使用相同的参数调用时,它将返回不同的结果。在stackoverflow中有一个关于随机函数不是纯函数的问题。