Abstrakte metoder i TypeScript-mixins


Jeg vil at en Typescript-miksin skal ha en abstrakt metode som implementeres av klassen den blandes inn i. Noe sånt som dette.

class MyBase { 
}

type Constructor<T = {}> = new (...args: any[]) => T;

function Mixin<TBase extends Constructor<MyBase>>(Base: TBase) {
  return class extends Base {

    baseFunc(s: string) {};

    doA()
    {
        this.baseFunc("A");
    }
  }
};

class Foo extends Mixin(MyBase) {
    constructor()
    {
      super();
    }

    baseFunc(s: string)
    {
      document.write("Foo "+ s +"...   ")            
    }
};

Nå fungerer dette, men jeg skulle virkelig ønske at baseFunc i mixinen kunne være abstrakt for å sikre at den blir implementert i Foo. Finnes det en måte å gjøre dette på, siden abstract baseFunc(s:string); sier at jeg må ha en abstrakt klasse, noe som ikke er tillatt for mixiner...

Svar #1

Anonym klasse kan ikke være abstrakt, men du kan fortsatt erklære lokal mixin-klasse som er abstrakt slik:

class MyBase { 
}

type Constructor<T = {}> = new (...args: any[]) => T;

function Mixin(Base: Constructor<MyBase>) {
  abstract class AbstractBase extends Base {
    abstract baseFunc(s: string);    
    doA()
    {
        this.baseFunc("A");
    }
  }
  return AbstractBase;
};


class Foo extends Mixin(MyBase) {
    constructor()
    {
      super();
    }

    baseFunc(s: string)
    {
      document.write("Foo "+ s +"...   ")            
    }
};

Relaterte artikler