使用类方法更新属性时,是否打算让Typescript在缩小类型方面如此严格?我并不是说Typescript应该以某种方式分析方法的作用,但这是类实例属性由方法修改的常规做法。
我知道将currentChar
从普通属性或属性获取器更改为方法可以解决此问题,但是我认为属性和获取器非常有价值。
export class Parser {
data = "abcdefg"
currentIndex = 0
get currentChar(): string {
return this.data[this.currentIndex]
}
nextChar(): void {
++this.currentIndex
}
}
(() => {
const parser = new Parser()
if (parser.currentChar !== "a") {
return
}
const aChar: "a" = parser.currentChar // = type 'a', value 'a'
parser.nextChar()
const bChar: "a" = parser.currentChar // = type 'a', value 'b'
if (parser.currentChar === "b") { // Error: This condition will always return 'false' since the types '"a"' and '"b"' have no overlap.
console.log("current char really equals 'b'")
}
})();
答案 0 :(得分:3)
这是控制流分析的局限性。由于您检查了class属性,因此将通过检查缩小属性的类型,并且在调用方法时,typescript不会清除此缩小。
您可以了解有关此here
的更多信息