Typescript 如何允许调用具有不同参数类型的函数?

How Typescript allowed calling function with different parameter types?

"typescript": "2.7.2"

How/WHY 此代码在 Angular 6 项目上没有任何 IDE 错误或 --aot 编译错误?

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;
}

TypeScript 使用结构 类型系统。这意味着类型是根据它们的 内容 进行比较的。与使用 名义 类型系统的大多数其他日常语言相反,在这些系统中,类型通过它们的 名称 进行比较。因此,在 TypeScript 中,可以在需要类型 A 的地方使用类型 B,因为类型 B 的 "shape" 与类型 A 所需的 "shape" 完全匹配——类型 A 的所有成员都存在于类型 B 中和他们自己的类型匹配。

TypeScript 语言设计者选择了这种方法,因为它非常适合现有的 JavaScript 习语,例如使用通过 AJAX 接收的普通对象文字,而不会将它们强制转换为命名类型。这种设计选择会在标称类型系统元素很方便的情况下造成一些摩擦(例如,ProductIdOrderId 等标识符类型应该不兼容)。

相关阅读: