什么时候应该在Angular中使用抽象?

时间:2019-10-19 11:02:58

标签: angular typescript

过去,我已经看过一些Java EE,.Net和其他企业应用程序体系结构。每一个都有至少一个抽象上层类,用于概括例如服务层:AbstractService

但是当谈到Angular时,我从未见过这样的事情。即使它具有一些标准化的服务/ api层。

我想知道它是否在打字稿中被认为是不好的做法,因为它只是下面的JavaScript。还是仅仅是没有教程或指导方针能够使深入的现实企业应用程序确实使用该抽象?我有点困惑。

1 个答案:

答案 0 :(得分:3)

在Angular中,abstract类有一些常见用例,其中最突出的是抽象类用作依赖注入令牌

依赖注入令牌(实现)

export abstract class AbstractEventService {
  dispatchEvent(event: any): void;
  listen(event: any): Observable<any>;
}

// Use the abstract class as interfaces
export class EventService implements AbstractEventService {
   // The compiler will force you to implement dispatchEvent() and listen()
}

// use the abstract class as a DI token (which you cannot do with interfaces)
providers: [provide: AbstractEventService , useClass: EventService ]

这种方法对于单元测试非常有用。您可以在TestBed.configureTestingModule()TestBed.overrideProvider()

中覆盖

服务基础类(扩展)

我在教程或演示中没有看到太多使用,但是在实际应用中使用过

export abstract class AbstractBaseService {
   // extending classes forced to implement these properties/functions
   protected abstract serviceID: string;
   protected abstract provideInitialState(): IState;

   protected formatResponse(response: IAccountResponse): IFormattedResponse {
       // logic accessible to sub-classes
       // override if necessary
   }
}

export class AccountService extends AbstractBaseService {
   // implement abstract properties and functions
   // override protected/private properties and functions if needs be
}

注释

您会注意到我提到了覆盖受保护的/私有属性和函数-这是TypeScript的局限性,因为它允许覆盖任何Abstract类的属性和函数