如何重载泛型方法,使它们在Typescript中不那么通用



我在一个抽象类中有一个通用的静态方法:

abstract class Base {
static find<T extends Base>(options?: Object): Promise<T[]> {
return findResults(options);
}
}

我想在派生类中指定它的类型:

class Extended extends Base { 
static find<Extended>(options?: Object): Promise<Extended[]>;
// Error: Function implementation is missing or not immediately following the declaration.
}

Typescript以任何方式支持这种行为吗?

该类型似乎违反了Extended静态侧的Liskov替换原则。显然,Extended构造函数需要是有效的Base构造函数,因此,如果Base.find()可以为扩展Base任何T返回Promise<T[]>,那么Extended.find()也应该能够做到这一点。

静态方法中的泛型很奇怪,因为静态成员不能访问类的类型参数。但也许你想要的根本不是通用的。。。您希望Base.find()返回Promise<Base[]>Extended.find()返回Promise<Extended[]>,对吗?这听起来像是多态this的一个激励性例子。不幸地多态this不支持静态成员,至少到目前为止是这样。

我的建议是手动实现您期望的关系:

abstract class Base {
static find(options?: Object): Promise<Base[]> {
return findResults(options); // is this some function somewhere?
}
}
class Extended extends Base {
// maybe not type safe 
static find: (options?: Object) => Promise<Extended[]>;
}

请注意,我在那里所做的只是声明Extended.find()返回一个Promise<Extended[]>,而不更改Base.find()的实现。这可能不是类型安全的,除非Base.find()的实现足够聪明,知道如何做到这一点。我有点怀疑,所以要小心。相反,您可能希望以不同的方式实现它:

class Extended extends Base {
static find(options?: Object): Promise<Extended[]> {
// change the implementation in a way that constrains the results,
// maybe with a type guard somewhere
}
}

好吧,希望能有所帮助。祝你好运

最新更新