类与接口来描述对象

时间:2019-05-09 21:35:49

标签: typescript class oop interface

在TypeScript中描述对象的正确方法是什么(可能不仅在TypeScript中)。例如,我有一些get http请求,该请求返回给我一个具有2个参数(名称和ID)的对象。 我看到三种描述方式。 首先是创建一个界面

export interface MyObject {
  name: string;
  id: number;
}

第二种方法是创建一个类

export class MyObject {
  public name: string;
  public id: number;
}

或同一个类,但带有getter和setters

export class MyObject {
  private _name: string;
  private _id: number;

  public get name(): string {
    return this._name;
  }

  public set name(value: string) {
    this._name = value;
  }

  // similarly for id
}

那么,最清晰,最正确的方法是什么?我主要使用接口来描述对象。但是我见过很多项目,这些项目按类描述对象,这三种方法的优缺点是什么。有没有最合适的一个?

1 个答案:

答案 0 :(得分:0)

  

例如,我有一些get http请求,该请求返回给我一个具有2个参数(名称和ID)的对象。我看到三种描述方式。

HTTP请求获取一个JSON字符串,然后对其进行解析。

动态方式

动态方式是简单地使用JSON解析器生成的对象。 interface是描述它的正确工具:

export interface MyObject {
  name: string;
  id: number;
}

// …
const result = JSON.parse(await fetch(…)) as MyObject;

OOP繁重的方式

在这里,JSON解析器提供了与以前相同的对象,但是我们更喜欢通过实例化一个类来创建另一个对象:

export class MyObject {
  constructor(public name: string, public id: number) {
  }
}

// …
const { name, id } = JSON.parse(await fetch(…));
const result = new MyObject(name, id);

最大冗长的OOP方式

同一件事,还有一个使用setter和getter的间接引用:

export class MyObject {
  private _name: string;
  private _id: number;

  public get name(): string {
    return this._name;
  }

  public set name(value: string) {
    this._name = value;
  }

  public get id(): number {
    return this._id;
  }

  public set id(value: number) {
    this._id = value;
  }
}

// …
const { name, id } = JSON.parse(await fetch(…));
const result = new MyObject();
result.name = name;
result.id = id;