我正在学习Udemy课程以学习Angular。在本课程中,我们正在制作一个显示食谱的应用程序,并允许您将食谱中的项目添加到购物清单中。我已经创建了一个模型来描述TypeScript中的一个成分,我已经将它们放在一个数组中。
代码如下所示:
这是模型(简短)
export class Ingredient {
constructor(public name: string, public amt: number) {}
}
以下是组件中使用的地方:
export class ShoppingListComponent implements OnInit {
ingredients: Ingredient[] = [
{ name: 'Apples', amt: 5 },
{ name: 'Tomatos', amt: 3 },
];
我的问题是:教师使用new
声明数组中的对象,如下所示:new Ingredient('Apples', 5)
但我想知道的是,new
关键字是否必要? ingredients
数组显式地输入到Ingredient,因此不会强制任何放入数组的对象符合Ingredient类吗?无论哪种方式,当我启动它时,我的应用程序上的数据显示相同。我知道打字有效,因为如果我将{ foo: 'bar' }
扔进数组,webpack就会拒绝编译。
使用new
调用构造函数和按照我的方式写出对象之间是否有区别?
答案 0 :(得分:2)
正如Jon所说,TypeScript使用结构类型。所以你做了什么"看起来"像一个成分,但实际上不是类的一个实例。
如果您执行某些操作,例如向类中添加方法或getter / setter,则代码将会中断。
例如,尝试向Ingredient
类添加方法:
export class Ingredient {
constructor(public name: string, public amt: number) {}
doubleAmount() {
return this.amt * 2;
}
}
您将看到您的数组会生成输入错误。
如果您按照以下方式进行声明,则不会产生错误:
ingredients: Ingredient[] = [
new Ingredient('Apples', 5),
new Ingredient('Tomatoes', 3),
];
所以即使你的对象"匹配"成分类定义将被TS视为成分(只要它们继续匹配),它们是不成分类的实例。
有意义吗?