gpt4 book ai didi

typescript 不检测方法改变的属性

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:03 24 4
gpt4 key购买 nike

所以我有以下代码:

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 没有检测到通过 changeNum 更改了 num 并抛出以下错误:

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

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

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

最佳答案

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

The primary question is: When a function is invoked, what should we assume its side effects are?

One option is to be pessimistic and reset all narrowings, assuming that any function might mutate any object it could possibly get its hands on. Another option is to be optimistic and assume the function doesn't modify any state. Both of these seem to be bad. (Emphasis added)

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 .

关于 typescript 不检测方法改变的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56066831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com