我遇到了以下我似乎无法解决的问题(我简化了本文的类)。我最终想指定各种请求。它们具有一定的层次结构,我计划使用继承进行建模。首先,我创建了一个抽象基类:
export abstract class RequestBase<TResult> {
public async execute(): Promise<TResult> {
const response = await this.transmit();
return this.getResult(response);
}
private async transmit(): Promise<any> {
// Code that transmits the requests, and yields a response, typed "any".
}
protected abstract getResult(response: any): TResult;
}
getResult
将把响应对象转换为派生类定义的类型。我计划在此之上有更多抽象类,例如:
export abstract class RequestDerived<TResult> extends RequestBase<TResult> {
constructor() {
super(); // some parameterization suited for this request type.
}
}
我遇到的问题是,我并不总是对请求的结果感兴趣。这意味着TResult
是void
。理想情况下,我可以写下这样的内容:
// A request that will convert the response to a number.
export class FirstRequest extends RequestDerived<number> {}
// A request for which we do not care about the result.
export class SecondRequest extends RequestDerived {}
当我在RequestDerived
上将通用约束指定为<TResult = void>
时,这种表示法是可能的,但这仍然迫使我在getResult
中实现SecondRequest
,这仅仅是一个虚拟功能。
从概念上讲,要实现的是getResult
的{{1}}实现,并在TResult = void
时指定派生类。像这样:
TResult != void
是否有某种方法可以实现而不必定义两个不同名称的类?我想避免这种情况的原因,因为这会延续到派生类(层次结构中的所有类也都有两个版本)。
谢谢!