如何正确创建角度域模型

时间:2018-07-12 09:27:03

标签: javascript angular typescript oop

我要正确创建域模型。

我在下面的尝试在构造函数之外创建属性。 我应该只在构造函数内部创建和设置TestModel类的属性吗?这样,他们的代码行会更少

我尝试了以下我认为正确的尝试:

export class TestModel1 {
  public currentPage: number = 0;
  public hasNext: boolean = false;
  public hasPrev: boolean = false;
  public pageSize: number = 0;
  public totalItems: number = 0;

  constructor(data: any) {
      this.currentPage = data.currentPage;
      this.hasNext = data.hasNext;
      this.hasPrev = data.hasPrev;
      this.pageSize = data.pageSize;
      this.totalItems = data.totalItems;
  }
}

似乎有点大,太多的代码行。

当前,我需要传递一个数据对象,然后进行映射。 他们是我使用构造函数更好地实现此目的的聪明方法吗?

2 个答案:

答案 0 :(得分:2)

如果我们谈论模型类,则其声明应类似于以下示例:

export class Account {
    constructor(
        public activated: boolean,
        public authorities: string[],
        public email: string,
        public firstName: string,
        public langKey: string,
        public lastName: string,
        public login: string,
        public imageUrl: string
    ) {}
}

当然,您不应在构造函数之外定义值。您可以像在示例中一样声明模型类成员,但是没有定义值:

export class TestModel1 {
  public currentPage: number;
  public hasNext: boolean;
  public hasPrev: boolean;
  public pageSize: number;
  public totalItems: number;

  constructor(data: any = null) {
    if(data !== null) {
      this.currentPage = data.currentPage;
      this.hasNext = data.hasNext;
      this.hasPrev = data.hasPrev;
      this.pageSize = data.pageSize;
      this.totalItems = data.totalItems;
    }
  }
}

如果要声明默认值,我的建议是在构造函数内执行此操作,以获取干净,优质的代码。

更新

export class TestModel1 {
  public currentPage: number;
  public hasNext: boolean;
  public hasPrev: boolean;
  public pageSize: number;
  public totalItems: number;

  constructor(data: any = null) {
    if(data !== null) {
      this.currentPage = data.currentPage;
      this.hasNext = data.hasNext;
      this.hasPrev = data.hasPrev;
      this.pageSize = data.pageSize;
      this.totalItems = data.totalItems;
    }
    else {
      this.currentPage = 0;
      this.hasNext = false;
      this.hasPrev = false;
      this.pageSize = 0;
      this.totalItems = 0;
    }
  }
}

如果您希望使用默认值,那会更好

答案 1 :(得分:0)

我在问题中看到的主要问题是重复的问题。所有属性都在构造函数中重复,这违反了干净代码的DRY原理。

如果您想以更简洁的方式填充域对象的新实例,则可以执行以下操作:

export class TestModel1 {
  public currentPage: number;
  public hasNext: boolean;
  public hasPrev: boolean;
  public pageSize: number;
  public totalItems: number;

  constructor(data: any) {
      Object.keys(data).forEach(key => {
         this[key] = data[key]
      });
  }
}

您必须确保输入数据对象仅具有正确的属性,这取决于数据源,这可能容易,也可能不容易。