Typescript - 尝试以派生类型作为参数在抽象基础上调用方法

Typescript - Trying to call method on abstract base with derived type as parameter

抽象基类有一个方法接受 base/derived 并在其上执行某些操作。 好像我在打字时遗漏了一些东西,试图找出什么。

尝试 1:

abstract class Base {
  protected runFuncOnThis = (func: (baseOrDerived: Base) => void) => {
    func(this);
  };
}

class Derived extends Base {
  public doIt = () => {
    this.runFuncOnThis((derived: Derived) => { // ERROR HERE
      console.log(derived);
    });
  };
}

错误: “(derived: Derived) => void”类型的参数不可分配给“(baseOrDerived: Base) => void”类型的参数。 参数类型 'derived' 和 'baseOrDerived' 不兼容。 属性 'doIt' 在类型 'Base' 中缺失,但在类型 'Derived'.ts(2345)

中是必需的

尝试 2:

abstract class Base2 {
  protected runFuncOnThis = <T extends Base2>(func: (baseOrDerived: T) => void) => {
    func(this); // ERROR HERE
  };
}

class Derived2 extends Base2 {
  public doIt = () => {
    this.runFuncOnThis((derived: Derived2) => {
      console.log(derived);
    });
  };
}

错误:'this' 类型的参数不可分配给 'T' 类型的参数。 'this' 可分配给类型 'T' 的约束,但 'T' 可以用约束的不同子类型实例化 'Base2'.ts(2345)

playground

由于您在箭头函数中使用 this,这意味着 this 是当前上下文 (Base) 同时 func 需要 Derived作为它的论据。将方法类型更改为普通函数(具有自己的上下文)并将 this 定义为 T extends Base 以满足 func 的参数。

abstract class Base {
  protected runFuncOnThis<T extends Base>(this: T, func: (baseOrDerived: T) => void) {
    func(this);
  };
}

class Derived extends Base {
  public doIt = () => {
    this.runFuncOnThis((derived) => {
      console.log(derived);
    });
  };
}

class Derived2 extends Base {
  public doIt = () => {
    this.runFuncOnThis((derived) => {
      console.log(derived);
    });
  };
  public someProperty = 123;
}