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



我的目标是使用 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 {}

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

虽然你的函数返回的类型非常重要,你应该尽可能使用它,但我认为你不必只为可以返回任何类型结果的特定类型的数据创建类。

如果一个类包含多个函数和属性,这不是问题,最重要的是内聚耦合的概念。如果您知道您的函数与类本身的目标相关,并且您认为每个方法都足够唯一,可以证明它是独立的,而不是作为另一个函数的一部分添加,那么您正在正确编写代码。话虽如此,如果你想提高可读性,使变量的名称尽可能唯一,并在可能出现混淆的地方留下注释,如果你必须返回任何类型,那么你必须这样做。

可能已经切线了,但希望这有所帮助。

如果有一组标准属性,并且问题是某些属性在某些实例中存在而其他实例不存在,那么您仍然可以使用接口:

例如:

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[];
}

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

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

如果你真的不知道你会得到什么属性,那么接口就没有意义。

最新更新