typescript - 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
再次检查。
问题是 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
}
}
}
}
这样做的结果是您的程序将采用更实用的方法。
推荐阅读
- libgdx - 带有视口的世界的 libgdx 等距平铺地图屏幕
- node.js - 猫鼬查询正则表达式以忽略中间字符
- flutter - 我怎样才能在这个计时器中访问这个布尔值?
- mysql - MySQL全文搜索按特定列排序
- python - Tensorflow - Keras 断开连接图
- javascript - 将 JSON 响应写入 Var JavaScript
- react-native - React Native 网络请求失败 HTTPS
- bash - 通过命令行配置 Nexus(非 gui)
- qt - 为什么 QFuture::isFinished() 提前结束?
- php - 基于类标签将 HTML 表转换为 XML