用于组件的Angular扩展API模型

时间:2019-01-30 08:55:43

标签: javascript angular typescript

我经常需要使用仅在组件视图中使用的参数来扩展我的API模型。

例如,我有一个模型:

export class Person {
  name: string;
  surname: string;
  address: string;
}

这是我从API中获得的东西:

getPersons(): Observable<Person[]> {
  return this.httpClient.get<Person[]>`${environment.API}/person`);
}

当我在组件中获得此参数时,我经常需要使用参数/属性扩展模型,在请求后或只是简单的“ active” /“ select”参数进行UI可视化跟踪后,我便会进行数据处理。

用于此目的的哪种方法。我知道2种解决方案:

1)即使该参数不参与服务器响应,也要将其添加到类模型中,只需将它们与标准参数分开即可:

export class Person {
  name: string;
  surname: string;
  address: string;

  ui_active: boolean;   // I know that those parameters are not from API        
  ui_fullName: string;  // response but they are here to make my life easier
}

2)使用这些参数制作另一个扩展类:

export class PersonExtended extends Person  {
  ui_active: boolean;       
  ui_fullName: string
}

但是这种方法使事情变得复杂,因为我有2个模型,并且需要一直在它们之间切换。

这种情况下的最佳实践是什么?

2 个答案:

答案 0 :(得分:3)

只需使用?-运算符将这些字段设置为可选:

export class Person {
  name: string;
  surname: string;
  address: string;

  ui_active?: boolean;       
  ui_fullName?: string; 
}

因此,您可以使用它们,但不必这样做。

编辑:

如果必须使用以下通用方法将其删除:

private omitFields<T>(object: T, fields: Array<string>): T {
    for (let field of fields) {
        delete object[field];
    }
    return object;
}

并使用它,例如:

this.omitFields(el, ['ui_active', 'ui_fullName']);

答案 1 :(得分:2)

我认为按代码排列的第二个选项是正确的,但是据我所知第一个选项没有什么问题,只需确保新参数可以为null或以某种方式被忽略,这样就可以避免错误,如果不将其设置在不需要它们。