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

问题描述 投票:0回答:1

所以我有以下代码:

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
,然后再次检查。

问题是 Typescript 没有检测到 num 通过

changeNum
进行了更改,并抛出以下错误:

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))
可以使程序正确编译,但这肯定不是一个好的解决方案!

typescript
1个回答
5
投票

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

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

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

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

这样做的结果是您的程序将采用更实用的方法

© www.soinside.com 2019 - 2024. All rights reserved.