我试图创建一个基类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]
答案 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
可以是通用的(第一次重载),也可以取决于其他类型。在这个例子中。此其他类型是类本身的类型参数。