打字稿使用派生类作为方法的返回类型

时间:2019-08-07 09:49:32

标签: typescript typescript-generics

我在打字稿中有一个抽象类,该类具有提供回调以供以后使用的方法。该方法的返回类型是类,因此我可以使用流利的样式编码。我正在尝试扩展类,但不确定如何获取返回派生类类型的方法:

export abstract class Wizard {
   ...

   public onPageChanging(handler: PageChangingHandler): Wizard { // Returns Wizard (but I would like this to be the derived class instead)
       this.onPageChangingHandler = handler;
       return this;
   }

   public onPageChanged(handler: PageChangedHandler): Wizard { // Returns Wizard (but I would like this to be the derived class instead)
       this.onPageChangedHandler = handler;
       return this;
   }
   ...
}

export class StepWizard extends Wizard {
   ...
}

呼叫代码:


export class Foo {

    private wizard: StepWizard;

    ...
    wireUpWizard() {
        this.wizard = new StepWizard({ 
             elem: HTMLElement,
        }).onPageChanging(pc => {
          // Handle Page Changing
        }).onPageChanged(pc => {
          // Handler Page Changed
        });

        // ISSUE: Can't use fluent chaining, as onPageChanging/onPageChanged returns Wizard instead of StepWizard
    }

    ...

}

我知道我需要以某种方式使用泛型来从onPageChanging和onPageChanged返回泛型类型,但是到目前为止我还不能做到这一点。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

您可能正在寻找polymorphic this type

export abstract class Wizard {
   ...

   public onPageChanging(handler: PageChangingHandler): this { // <-- here
       this.onPageChangingHandler = handler;
       return this;
   }

   public onPageChanged(handler: PageChangedHandler): this { // <-- here
       this.onPageChangedHandler = handler;
       return this;
   }
   ...
}