覆盖打字稿中的通用方法

时间:2019-01-26 13:50:25

标签: typescript

我试图创建一个基类AbstractQuery并由子类继承它,然后覆盖其某些方法。

class AbstractQuery {
    public before<A, S>(context: Context<A>, args: A, source?: S): Promise<A> {
        return Promise.resolve(args);
    }
}

现在,我想在子类中覆盖以上AbstractQuery::before方法:

class FindBookByIdQuery extends AbstractQuery {
    public before(context: Context<arguments.ID>, args: arguments.ID): Promise<arguments.ID> {
        this.log.debug('hook before args', args);
        return Promise.resolve(args);
    }
}

但是我遇到了错误:

  

[ts]   'FindBookByIdQuery'类型的'before'属性不能分配给基本类型'AbstractQuery'的相同属性。     类型'(context:Context,args:ID)=> Promise'不能分配给类型'((context:Context,args:A,source ?: S)=> Promise'。       参数“上下文”和“上下文”的类型不兼容。         类型“上下文”不能分配给类型“上下文”。           类型“ A”不可分配给类型“ ID”。 [2416]

1 个答案:

答案 0 :(得分:1)

TypeScript指出错误是正确的。在AbstractQuery中,before方法使用的上下文与其类型参数绑定。但是,在FindBookByIdQuery中不存在这种关系。

如果要允许before具有可变行为,请重载其定义。考虑以下示例:

declare abstract class Foo<T> {
    before<U>(context: U): Promise<U>;
    before(context: T): Promise<T>
}

declare class Bar<T> extends Foo<T> {
    before(context: T): Promise<T>
}

在这里,before可以是通用的(第一次重载),也可以取决于其他类型。在这个例子中。此其他类型是类本身的类型参数。