'new'与隐式打字

时间:2018-03-14 17:05:54

标签: angular typescript object

我正在学习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调用构造函数和按照我的方式写出对象之间是否有区别?

1 个答案:

答案 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视为成分(只要它们继续匹配),它们是成分类的实例。

有意义吗?