比较可变枚举成员变量时Typescript编译器错误

比较可变枚举成员变量时Typescript编译器错误,typescript,enums,Typescript,Enums,我得到一个错误: TS2365: Operator '===' cannot be applied to types 'ExampleState.Unsaved' and 'ExampleState.Saving'. 将枚举与可变成员变量进行比较时: enum ExampleState { Unset = -1, Unsaved = 0, Saving = 1, Saved = 2 } class Example { private state :

我得到一个错误:

TS2365: Operator '===' cannot be applied to types 'ExampleState.Unsaved' and 'ExampleState.Saving'.
将枚举与可变成员变量进行比较时:

enum ExampleState {
    Unset = -1,
    Unsaved = 0,
    Saving = 1,
    Saved = 2
}

class Example {

    private state : ExampleState = ExampleState.Unset;

    public Save() {
        if (this.state === ExampleState.Unsaved) {
            this.BeginSaving();
            while (this.state === ExampleState.Saving) {  // !error!
                this.CommitSave();
            }
        }
    }

    private BeginSaving() {
        this.state = ExampleState.Saving;
    }

    private CommitSave() {
        this.state = ExampleState.Saved;
    }
}
真正的例子是一个异步方法,它多次尝试保存- 这已被简化为仅说明错误

Typescript似乎不理解这个变量是可变的,并且假设它没有被更改,就过于激进了。为什么会发生这种情况?解决方法是什么?

这是一个问题

因为您可以为state属性创建包装器方法。(谢谢@Paleol)

访问


您可以使用
while(this.state as any===ExampleState.Saving)
作为解决方法。但是我建议你这样做。同样的建议,尽管我更愿意:
while(this.state作为ExampleState===ExampleState.Saving)
关于这一点有一个开放的问题:在@Magu发布的问题中,有一个。我认为这是最好的解决办法。
enum ExampleState {
    Unset = -1,
    Unsaved = 0,
    Saving = 1,
    Saved = 2
}

class Example {

    private state : ExampleState = ExampleState.Unset;

    private State() { 
        return this.state;
    }

    public Save() {
        if (this.State() === ExampleState.Unsaved) {
            this.BeginSaving();
            while (this.State() === ExampleState.Saving) { 
                this.CommitSave();
            }
        }
    }

    private BeginSaving() {
        this.state = ExampleState.Saving;
    }

    private CommitSave() {
        this.state = ExampleState.Saved;
    }
}