重载打字稿中的类泛型

时间:2018-12-01 00:34:13

标签: javascript typescript generics inheritance overloading

我遇到了以下我似乎无法解决的问题(我简化了本文的类)。我最终想指定各种请求。它们具有一定的层次结构,我计划使用继承进行建模。首先,我创建了一个抽象基类:

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.
    }
}

我遇到的问题是,我并不总是对请求的结果感兴趣。这意味着TResultvoid。理想情况下,我可以写下这样的内容:

// 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

是否有某种方法可以实现而不必定义两个不同名称的类?我想避免这种情况的原因,因为这会延续到派生类(层次结构中的所有类也都有两个版本)。

谢谢!

0 个答案:

没有答案