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

Angular Typescript如何允许使用不同的参数类型调用函数?,angular,typescript,angular6,Angular,Typescript,Angular6,在Angular 6项目上,该代码如何/为什么在没有任何IDE错误或--aot编译错误的情况下工作 "typescript": "2.7.2" - TypeScript使用结构类型系统。这意味着类型将根据其内容进行比较。与大多数其他日常语言不同,他们使用命名类型系统,通过名称来比较类型。因此,在TypeScript中,类型B可以用于预期类型A的地方,因为类型B的“形状”与类型A所需的“形状”完全匹配–类型A的所有成员都存在于类型B中,并且它们自己的类型匹配 TypeScript语言设计人员选择

在Angular 6项目上,该代码如何/为什么在没有任何IDE错误或--aot编译错误的情况下工作

"typescript": "2.7.2"
-

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

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

相关阅读:

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

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

相关阅读:


这两个类是相同的,我看不出参数类型有任何不同…@trichetriche我编辑了这个问题。这些类并不完全相同,但它是有效的。另一方面,如果它们完全相同并且有不同的名称,那么它可以工作吗?添加属性不会在已经工作的类上创建错误。。。这也将毫无问题地发挥作用。不同的名称是什么意思?name属性的值是多少?我真的不知道你要去哪里,也许你应该说什么困扰着你;我懂了。在Javascript中,类不存在,变量也不类型化。这意味着,只要类具有所需的属性,它就可以工作。尝试将一个
名称
重命名为
姓氏
,您将看到IDE抛出错误。如果你看它,你会发现它说对象不再匹配了(不是类,不是值,不是类型,而是普通对象),我想它们只会在Javascript错误弹出时抛出错误,因为Typescript永远不会被读取为Typescript。也许你可以设置你的linter来检测这种问题,但我不知道如何…这两个类是相同的,我看不出参数类型有任何区别…@trichetriche我编辑了这个问题。这些类并不完全相同,但它是有效的。另一方面,如果它们完全相同并且有不同的名称,那么它可以工作吗?添加属性不会在已经工作的类上创建错误。。。这也将毫无问题地发挥作用。不同的名称是什么意思?name属性的值是多少?我真的不知道你要去哪里,也许你应该说什么困扰着你;我懂了。在Javascript中,类不存在,变量也不类型化。这意味着,只要类具有所需的属性,它就可以工作。尝试将一个
名称
重命名为
姓氏
,您将看到IDE抛出错误。如果你看它,你会发现它说对象不再匹配了(不是类,不是值,不是类型,而是普通对象),我想它们只会在Javascript错误弹出时抛出错误,因为Typescript永远不会被读取为Typescript。也许你可以设置你的过梁来检测这种问题,但我不知道如何。。。
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;
}