如何为组件的服务创建联合类型?
How do you create a union type for a component's services?
我有一个调用服务方法的组件。该组件是基础组件,因此子组件使用 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.
有没有一种无需求助于 any
的简洁方法?
因此,正如 @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);
}
}
我有一个调用服务方法的组件。该组件是基础组件,因此子组件使用 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.
有没有一种无需求助于 any
的简洁方法?
因此,正如 @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);
}
}