角度:为包含许多不同属性的对象定义自定义类型/模型的正确方法是什么?

时间:2018-08-15 22:30:03

标签: angular

我的目标是使用TypeScript增强当前代码库的可读性。我已经在许多服务和组件中意识到,我最终得到了大量代码,这些代码具有参数类型和返回类型any

例如,类似于下面的代码,但具有更多功能。

import { Injectable } from '@angular/core';

@Injectable()
export class ExampleService {

  private someFuncA(objA: any): void {
    // Do some work
  } 
  private someFunB(objA: any): any {
    // Do some work
  }
  private someFunC(objB: any): string {
    // Do some work
  }
}

问题是objA是一个非常大的对象,可以具有数百个属性。有时这些属性存在,有时则不存在。 这些对象来自服务器,我无权对其进行更改。

我想做的是将any类型更改为有意义的内容,以使代码更易于阅读。例如下面的代码:

import { Injectable } from '@angular/core';

@Injectable()
export class ExampleService {

  private someFuncA(objA: SeismicData): void {
    // Do some work
  } 
  private someFunB(objA: SeismicData): SeismicData {
    // Do some work
  }
  private someFunC(objB: ReflectiveData): number {
    // Do some work
  }
}

我知道我不能使用任何接口,因为对象的结构是如此动态。属性可以存在于一个实例中,而不能存在于另一个实例中。我不确定创建仅空白的模型是否有意义:

export class SeismicData {}

但是,我不认为这是最佳/正确的做法,希望社区中的某人可以在正确的方向指导我如何处理此类用例。

2 个答案:

答案 0 :(得分:2)

虽然函数返回的类型非常重要,并且应该在可能的情况下使用它,但我认为您不必为可以返回任何类型结果的特定数据类型创建类。

如果一个类包含多个函数和属性,这不是问题,最重要的是 cohesion coupling 的概念。如果您知道函数与类本身的目标相关,并且您认为每种方法都具有独特性,足以证明其独立存在并且不作为其他函数的一部分进行添加,则可以正确编写代码。话虽如此,如果您想提高可读性,请使变量的名称尽可能唯一,并在可能造成混淆的地方留下注释,并且如果必须返回任何类型,则必须这样做。

可能已经切线了,但希望能帮上忙。

答案 1 :(得分:1)

如果存在一些标准属性,而问题在于某些情况在某些情况下存在而其他情况则不存在,那么您仍然可以使用接口:

例如:

export interface Movie {
    id: number | null;
    approvalRating?: number | null;
    description?: string;
    director?: string;
    imageurl?: string;
    mpaa?: string;
    price?: number | null;
    releaseDate?: string;
    starRating?: number | null;
    title?: string;
    category?: string;
    tags?: string[];
}

问号表示这些属性是可选的。因此,在上面的示例中,唯一的 required 属性是id。

仅当对象具有一些预定义的属性集时才有意义,但是只有其中一些存在。

如果您真的不知道将获得什么属性,那么接口就没有意义。