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);
}
}