所以我有以下代码:
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它是一个类,具有一个属性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))
使程序正确编译,但是这显然不是一个好的解决方案!
这是控制流分析的已知问题。
主要问题是:调用函数时,我们应该假定它的副作用是什么?
一种选择是悲观并重置所有范围,假设任何函数都可能变异它可能会得到的任何对象。另一个选择是保持乐观,并假设函数不会修改任何状态。这些似乎都不好。(已强调)
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的结果是您的程序将采用更实用的方法。
归档时间: |
|
查看次数: |
43 次 |
最近记录: |