在下面的代码中,Typescript编译器说类型'never'不存在属性'doit'。这可能是编译器错误吗?

class X {
    public foo(): void {
        if (this instanceof Y) {
        } else {
            this.doit();
        }
    }

    private doit(): void {
    }
}

class Y extends X {
}

我发现以下解决方法:
const temp = (this instanceof Y);
if (temp) {
} else {
    this.doit();
}

编译器与此等效代码没有任何问题,这再次使我怀疑这里存在编译器错误。

最佳答案

是的,这似乎是一个错误:InstanceOf incorrectly narrow when two type extends same base class

但是,无论如何,您在做什么的重点是什么?
如果您希望fooY实例中的行为有所不同,那么为什么不在Y中覆盖它:

class Y extends X {
    public foo(): void {
        ...
    }
}

并且,如果仅在doit实例中需要Y,则应在Y中使用,如果两者都需要,则可以在X中对其进行保护。

09-28 11:18
查看更多