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

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 substitution principle。显然Extended构造函数需要是一个有效的Base构造函数,因此如果Base.find()可以为任何扩展Promise<T[]>T返回一个Base,那么Extended.find()也应该能够这样做。
静态方法中的泛型很奇怪,因为静态成员无法访问类的类型参数。但也许你想要的根本不是普通的…你希望Base.find()返回Promise<Base[]>,而Extended.find()返回Promise<Extended[]>,对吧?这听起来像是一个激励polymorphic this的例子。不幸的是
polymorphic this isn't supported for static members,至少到目前为止。
我的建议是手动实现您期望的关系:

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()的实现足够聪明,能够知道如何做到这一点。我有点怀疑,所以小心点。相反,您可能希望以不同的方式实现它:
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
  }
}

好吧,希望能帮上忙。祝你好运!

关于typescript - 如何重载泛型方法,以减少Typescript中的泛型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51521800/

10-10 18:21