Typescript использует производный класс в качестве возвращаемого типа метода

У меня есть абстрактный класс в машинописном тексте, у которого есть метод для предоставления обратного вызова для последующего использования. Возвращаемый тип метода — это класс, поэтому я могу использовать свободное кодирование. Я пытаюсь расширить класс, но не знаю, как заставить метод возвращать тип производного класса:

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
    }

    ...

}

Я знаю, что мне нужно каким-то образом использовать Generics, чтобы вернуть универсальный тип из onPageChanging и onPageChanged, но пока мне это не удалось.

Может ли кто-нибудь помочь?


person fabiossa    schedule 07.08.2019    source источник


Ответы (1)


Возможно, вы ищете полиморфный тип. .

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;
   }
   ...
}
person Morphyish    schedule 07.08.2019
comment
Я ожидал, что это будет намного сложнее, чем это. Огромное спасибо - person fabiossa; 07.08.2019