I',遇到TypeScript编译器问题。为什么以下代码段没有显示任何错误?
class A {
}
class B {
myVar:string;
}
class Foo {
bar(a:A){}
doSomething(){
this.bar(new B());
}
}
由于 B 不是 A ,是否应该禁止带 B 的 bar -call?
答案 0 :(得分:5)
此处不应禁止* bar- *调用,因为TypeScript具有结构类型关系。因此,根据the specification,A和B不仅通过名称进行比较,而是通过枚举和比较其成员进行比较。如下。
bar()调用要求其参数类型可分配给相应的参数类型。所以,"新B()"类型应该分配给" A" (规范部分4.12.1"过载决议")
如果我们比较" B"和" A"结构上根据规范第3.8.4节和#34;分配兼容性"中提出的算法,我们看到" B"可分配给" A"。
如果您想进一步尝试,只需添加一些属性" x"到A级。你会看到你的错误。