TypeScript中这两个类之间有什么区别(有或没有构造函数)?

时间:2017-08-23 08:11:26

标签: angular typescript

我正在关注Angular的官方文件The Tour of Heroes。我改变了一点。现在有两种不同的方法可以编写如下所示的类:

user.ts

export class User {
  url: string;
  id: number;
  username: string;
  email?: string;
  images: string[];
  files?: number[];
  password?: string;
  first_name?: string;
  last_name?: string;
}

这是编写用于验证User正确性的类的原始方法,我也可以像这样创建一个新的User

newUser: User = {url: '', id: 0, username: 'Alpha', images: []};

我最近找到了一种写课的新方法:

images.ts

export class Image {

  constructor(
    public id: number,
    public created: string,
    public userId: number,
    public fileUrl: string,
    public owner: string,
    public des?: string,
  ) { }

}

我可以像这样创建一个新的Image

newImage = new Image(50, '20170822', 12, '', 'Belter');

我想问一下它们之间有什么区别,哪个更好用。

1 个答案:

答案 0 :(得分:1)

在第一种情况下,您实际上并未实例化User类。您为变量分配符合User类形状的对象文字。由于Typescript具有结构类型系统,因此允许(对象的形状不是声明的类型)

如果您的类只包含数据,那么最好定义一个接口并为其分配对象文字。这更接近于Javascript的做事方式。将它声明为接口而不是类更好,因为instanceof运算符可能会给您带来意想不到的结果。例如,在您的第一个代码段newUser instanceof User中将为false,因为您指定的对象文字不是User类的实例。 instanceof会给接口带来编译时错误,因为它们在Javascript中并不存在。

export interface User {
  url: string;
  id: number;
  username: string;
  email?: string;
  images: string[];
  files?: number[];
  password?: string;
  first_name?: string;
  last_name?: string;
}
var newUser: User = { url: '', id: 0, username: 'Alpha', images: [] };