"typescript": "2.7.2"
如何/为什么这段代码在没有任何IDE错误或Angular 6项目的编译错误的情况下工作?
private func1() {
const b: B = new B();
b.name = 'jack';
this.func2(b);
}
private func2(a: A) {
console.log(a.name); //prints jack
}
-
export class A {
public name: string;
}
export class B {
public name: string;
public surname: string;
}
答案 0 :(得分:2)
TypeScript使用结构类型系统。这意味着通过内容比较类型。与大多数其他日常语言相反,他们使用名义类型系统,其中类型通过名称进行比较。因此,在TypeScript中,类型B可以在预期类型A的地方使用,因为类型B的“形状”与类型A所需的“形状”完全匹配 - 类型A的所有成员都存在于类型B和它们自己的类型中匹配。
这种方法是由TypeScript语言设计者选择的,因为它非常适合现有的JavaScript惯用法,例如使用通过AJAX接收的普通对象文字而不将它们强制转换为命名类型。当标称类型系统元素很方便时,这种设计选择会导致一些摩擦(例如ProductId
和OrderId
之类的标识符类型应该是不兼容的。)
相关阅读: