使用类方法更新属性时,Typescript类型缩小的范围太严格

时间:2018-11-28 17:14:19

标签: typescript

使用类方法更新属性时,是否打算让Typescript在缩小类型方面如此严格?我并不是说Typescript应该以某种方式分析方法的作用,但这是类实例属性由方法修改的常规做法。

我知道将currentChar从普通属性或属性获取器更改为方法可以解决此问题,但是我认为属性和获取器非常有价值。

Stackblitz

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'")
    }
})();

1 个答案:

答案 0 :(得分:3)

这是控制流分析的局限性。由于您检查了class属性,因此将通过检查缩小属性的类型,并且在调用方法时,typescript不会清除此缩小。

您可以了解有关此here

的更多信息