Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何为组件创建联合类型';s服务?_Angular_Typescript_Angular2 Services_Angular2 Components - Fatal编程技术网

Angular 如何为组件创建联合类型';s服务?

Angular 如何为组件创建联合类型';s服务?,angular,typescript,angular2-services,angular2-components,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);

我有一个调用服务方法的组件。此组件是基本组件,因此子组件使用
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);
  }
}
只要我在
ParentComponent
中包含
any
,所有这些都可以正常工作。但当我从联合类型中删除
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.
无法调用其类型缺少调用签名的表达式。类型“(用户=>Promise)|(用户=>Promise)|(用户=>Promise)”没有兼容的调用签名。
是否有一种干净的方法可以做到这一点,而不必求助于
任何

因此,正如所建议的那样,一个界面是一种方法

这是接口和更新的构造函数。(根据需要更新
Promise
wrapper)

接口动态服务{
注册:(服务)=>(承诺);
}
导出类ParentComponent{
构造函数(受保护的myService:DynamicService){
}
寄存器(formData){
让response=wait this.myService.register(formData);
}
}
导出类ChildComponent扩展了ParentComponent{
构造函数(受保护的serviceOne:serviceOne){
超级(服务一);
}
}

如果您使用接口类型而不是具体类型,它是否工作得更干净?(我没有试过……只是问一下。)您的BaseService和ServiceOne都定义了一个名称相同但签名不兼容的方法。@IngoBürk哎呀。我更新了
BaseService
的方法名称以反映现实:)@DeborahK我仍然收到“不兼容的调用签名”错误。是否需要使用
wait
调用
register
?如果删除错误,它会消失吗?
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);
  }
}