Как создать тип объединения для служб компонента? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть компонент, который выполняет вызов метода службы.Этот компонент является базовым компонентом, поэтому дочерние компоненты предоставляют службу, используя 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);
  }
}

Каждая служба (ServiceOne, ServiceTwo и ServiceThree) все простираются оттот же базовый сервис с общим 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 голосов
/ 13 декабря 2018

Итак, как предположил @ 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);
  }
}
...