Angular Typescript如何允许使用不同的参数类型调用函数?
在Angular 6项目上,该代码如何/为什么在没有任何IDE错误或--aot编译错误的情况下工作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语言设计人员选择
"typescript": "2.7.2"
-
TypeScript使用结构类型系统。这意味着类型将根据其内容进行比较。与大多数其他日常语言不同,他们使用命名类型系统,通过名称来比较类型。因此,在TypeScript中,类型B可以用于预期类型A的地方,因为类型B的“形状”与类型A所需的“形状”完全匹配–类型A的所有成员都存在于类型B中,并且它们自己的类型匹配
TypeScript语言设计人员选择了这种方法,因为它非常适合现有的JavaScript习惯用法,例如使用通过AJAX接收的普通对象文本,而无需将它们强制转换为命名类型。在标称类型系统元素比较方便的情况下(例如,ProductId
和OrderId
等标识符类型应不兼容),这种设计选择会造成一些摩擦
相关阅读:
ProductId
和OrderId
等标识符类型应不兼容),这种设计选择会造成一些摩擦
相关阅读:
名称
重命名为姓氏
,您将看到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;
}