【发布时间】:2020-06-22 13:03:10
【问题描述】:
观察
我发现我的代码编辑器(vscode)没有抱怨第 5 行。所以我认为这只是一个打字稿扩展错误。但是我编译的时候(tsc),编译成功了。
class A {}
class B {}
class C {}
type X = A | B;
let x: X = new C();
进一步观察
当我用一些成员字段/方法定义class A 和class B 并将class C 留空时,编译失败。我定义了class D和class E,其成员字段/方法与class A或class B中的任何一个相同,然后它编译成功
class A {public a: string;}
class B {public f() {};}
class C {}
class D {public a: string;}
class E {public f() {};}
type X = A | B;
let x: X = new C(); // fail
let y: X = new D(); // success
let z: X = new E(); // success
进一步观察
在上面的例子中,下面给出了false、false和true。
console.log(y instanceof A);
console.log(y instanceof B);
console.log(y instanceof D);
问题
tsc 是否检查类型相等性/可分配性 不是用类名 而是用成员签名?
(所有测试都使用tsc --version = 3.8.3)
【问题讨论】:
标签: typescript