【问题标题】:'new' vs implicit typing“新”与隐式类型
【发布时间】:2018-03-15 01:27:18
【问题描述】:

我正在参加 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 数组被显式键入到成分中,所以不会强制放入数组中的任何对象符合成分类吗?无论哪种方式,当我启动它时,我的应用程序上的数据都会显示相同。而且我知道打字有效,因为如果我将{ foo: 'bar' } 扔到数组中,webpack 会拒绝编译。

new 调用构造函数和像我一样写出对象有区别吗?

【问题讨论】:

  • TS 使用结构性而非名义性的类型。因此,只要您的对象满足接口,无论您是 new 还是从文字构建它都没有关系。但是new 一个有方法、访问器等的类要容易得多。
  • 相关帖子,stackoverflow.com/a/49084429/3731501 。 TL;DR:如果您不需要类可以提供的任何东西,请改用接口。

标签: angular typescript object


【解决方案1】:

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

有意义吗?

【讨论】:

  • 是的,我认为这是有道理的。它是与类型匹配的对象,但不是成分的实例。谢谢。
猜你喜欢
  • 2013-08-02
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多