2017-06-14 22 views
2

Ich möchte ein Typoskript Mixin eine abstrakte Methode haben, die von der Mixed-in-Klasse implementiert wird. Etwas wie das.Abstrakte Methoden in Typoskripts Mixins

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 +"... ")    
    } 
}; 

Nun, dies funktioniert, aber ich würde wirklich baseFunc im mixin mag abstrakt machen, um sicherzustellen, dass es in Foo umgesetzt wird. Gibt es eine Möglichkeit, dies zu tun, wie abstract baseFunc(s:string); sagt ich muss eine abstrakte Klasse, die nicht für Mixins erlaubt ist ...

Antwort

2

Anonyme Klasse kann nicht abstrakt sein, aber Sie können immer noch lokale Mixinklasse, die abstrakt ist wie folgt:

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 +"... ")    
    } 
}; 
+0

Ich dachte, ich hätte das probiert! Warum funktioniert abstrakte Klasse nicht? (bearbeiten - ah! weil es anonym ist!) – Roddy

+0

Dieses Beispiel verliert die Methoden und Eigenschaften von MyBase. Sie können mit 'function Mixin > (Basis: B)' beheben. –

Verwandte Themen