以下打字稿片段在严格模式下重现了(编译器)问题,编译后的代码运行良好:
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);
}
public static IsA(wrapper: Wrapper<TClass>): wrapper is Wrapper<ClassA>
{
return wrapper.source instanceof ClassA;
}
public static IsB(wrapper: Wrapper<TClass>): wrapper is Wrapper<ClassB>
{
return wrapper.source instanceof ClassB;
}
}
console.log('ClassA');
new Wrapper(new ClassA()); // logs 'A'
console.log('\nClassB');
new Wrapper(new ClassB()); // logs 'BB'
我怀疑编译器将范围缩小到常见的基本类型ClassX
,但是我没有针对基类进行测试!就instanceof
而言,子类是否不优先于基类?
我想念什么?