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

时间:2018-05-15 09:55:17

标签: angular typescript angular6

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

1 个答案:

答案 0 :(得分:2)

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

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

相关阅读: