Typescript无法检测到方法更改的属性

时间:2019-05-09 20:07:59

标签: typescript

所以我有以下代码:

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

  }

  private changeNum() {
    this.num = Math.random();
  }

  private fn() {
    if(this.num == 1) {
      this.changeNum();
      if(this.num == 0.5) {
        // do stuff
      }
    }
  }
}

这是一个类,具有一个属性num和一个函数changeNum,用于更改该数字。

然后,它还具有另一个功能fn,该功能首先检查num是否等于1,如果是,则将num更改为changeNum,然后再次检查。 / p>

问题是Typescript无法检测到通过changeNum更改了num并引发了以下错误:

This condition will always return 'false' since the types '1' and '0.5' have no overlap.

是否有办法让Typescript识别num已通过changeNum进行了更改?

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

1 个答案:

答案 0 :(得分:4)

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

  

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

     

一个选择是悲观的并且重置所有缩小的范围,假设任何函数都可能变异它可能会得到的任何对象。另一个选择是保持乐观,并假设该函数不会修改任何状态。这两个似乎都不好。 (添加了强调)

https://github.com/Microsoft/TypeScript/issues/9998

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
        }
    }
  }
}

其结果是您的程序将使用a more functional approach