如何为组件的服务创建联合类型?

时间:2018-12-12 21:37:57

标签: angular typescript angular2-services angular2-components

我有一个调用服务方法的组件。该组件是基本组件,因此子组件将使用super()来提供服务,如下所示:

export class ParentComponent {
  constructor(protected myService: ServiceOne | ServiceTwo | ServiceThree | any) {

  }

  register(formData) {
    let response = await this.myService.register(formData);
  }
}

export class ChildComponent extends ParentComponent {
  constructor(protected serviceOne: ServiceOne) {
    super(serviceOne);
  }
}

每个服务(ServiceOneServiceTwoServiceThree)都使用共享的register()方法从同一基础服务扩展。

@Injectable()
export class ServiceOne extends BaseService {
  register(user) {
    return this.post('url', user);
  }
}

export class BaseService {
  protected post(url, data) {
    return this.http.post(url, data);
  }
}

只要我在any中包含ParentComponent,所有这些工作都很好。但是,当我从联合类型中删除any时,我得到:

Cannot invoke an expression whose type lacks a call signature. Type ‘(user => Promise<any>) | (user => Promise<any>) | (user => Promise<any>)’ has no compatible call signature.

是否有一种干净的方法来执行此操作而不必诉诸any

1 个答案:

答案 0 :(得分:1)

因此,正如@DeborahK所建议的那样,界面是必经之路。

这是接口和更新的构造函数。 (根据需要更新Promise<>包装器)。

interface DynamicService {
  register: (service) => (Promise<ServiceOne | ServiceTwo | ServiceThree>);
}

export class ParentComponent {
  constructor(protected myService: DynamicService) {

  }

  register(formData) {
    let response = await this.myService.register(formData);
  }
}

export class ChildComponent extends ParentComponent {
  constructor(protected serviceOne: ServiceOne) {
    super(serviceOne);
  }
}