以下打字稿片段在严格模式下重现(编译器)问题,编译后的代码运行良好:
class ClassX
{
constructor(public label: string) {}
}
class ClassA extends ClassX
{
constructor() { super('A'); }
}
class ClassB extends ClassX
{
constructor() { super('B'); }
}
type TClass = ClassA | ClassB;
class Wrapper<T extends TClass>
{
constructor(public source: TClass)
{
if(Wrapper.IsB(this)) console.log(this.source.label);
// Works normally:
// if(source instanceof ClassA) this.Log();
// else if(source instanceof ClassB) this.Log();
if(Wrapper.IsA(this)) console.log(this.source.label);
// this results in 'never', would emit error TS2339 without the type guard
else if(Wrapper.IsB(this)) console.log((this as Wrapper<ClassB>).source.label); …Run Code Online (Sandbox Code Playgroud)