2017-03-29 3 views
4

Ich versuche ES6 Mixin in TypeScript zu verwenden. Was ich habe ist wie folgt, und es funktioniert perfekt mit BaseClass.ES6 Mixin mit generischem Typ in TypeScript

class BaseClass { 
    public foo() {} 
}; 

interface IMyMixin { 
    foo2(); 
} 

let MyMixin = (superclass: typeof BaseClass) => class extends BaseClass implements IMyMixin { 
    public foo2() {} 
} 

class MyBaseClass extends MyMixin(BaseClass) { 

} 

Allerdings kann ich mich bewerben MyMixin nicht auf abgeleitete Klasse von BaseClass; In der Zwischenzeit kann ich auch keine generische Mischung machen.

Gibt es eine Möglichkeit, es für BaseClass und DerivedClass arbeiten zu lassen?

class DerivedClass extends BaseClass { 
    public bar() {} 
} 

class MyDerivedClass extends MyMixin(DerivedClass) { 
    public something() { 
// Compile Error: Property 'bar' does not exist on type 'MyDerivedClass' 
     this.bar(); 
    } 
} 

// Compile Error: 'T' only refers to a type, but is being used as a value here. 
let MyMixin = <T extends BaseClass>(superclass: typeof T) => class extends T implements IMyMixin { 
    public foo2() {} 
} 
+0

Haben Sie vor zu schreiben "Klasse erweitert Superklasse implementiert IMyMixin" anstelle von "Klasse erweitert BaseClass implementiert IMyMixin"? Andernfalls wird 'superclass' -Variable nicht in der' MyMixin'-Factory-Funktion verwendet. –

+0

@Maximus Vielen Dank, mir war nicht klar, dass 'superclass' im Rückgabetyp verwendet werden könnte. – Haocheng

Antwort

1

Ich habe Lösung von TypeScript/PR#13743 gefunden, und es mit Kommentaren von @Maximus optimiert.

Dieses Stück Code funktioniert. Der Grund ist, dass in MyMixin, T ein Class (d. H. Ein Konstruktor) sein sollte, kein Typ.