Nein, Typoskript Typ-System zu schaffen, ist nicht ausdrucksstark genug dafür - die Diskussion in https://github.com/Microsoft/TypeScript/issues/7225 und https://github.com/Microsoft/TypeScript/issues/4890 sehen.
Der idiomatische Typ-Klassen in Typoskript als
interface Constructor<T> {
new (...args): T;
}
eine Art und Weise so geschrieben, wird eine Erklärung für Compose zu schreiben, ist
export declare class Simple {}
export declare class Super extends Simple {
static Compose<T>(Base?: Constructor<T>): Constructor<T & {/*mixed-in declarations*/}>
}
Das heißt, Compose Rückgabetyp deklariert werden Konstruktor für Schnitttyp - ein Typ, der alle Eigenschaften des Parameters (Basis) zusammen mit allen Eigenschaften des Mixins haben muss.
Sie diese Erklärung verwenden kann (vorausgesetzt, es in der library.d.ts Datei ist) wie diese
import {Super} from './library'
let MyComposed = Super.Compose(Super)
let myInstance = new MyComposed
Die kleine Unannehmlichkeit ist, dass Sie immer Argument für Super.Compose zu bieten haben(), weil Typinferenz funktioniert nicht, ohne den Wert für den Standardparameter zu kennen, und Sie können keinen Wert für den Standardparameter in der Deklarationsdatei angeben.
Aber das große Problem ist, dass man nicht wirklich das Ergebnis der Compose als Klasse verwenden können:
class MyClass extends Super.Compose(Super) {}
lässt sich nicht kompilieren aufgrund der oben genannten Themen:
error TS2509: Base constructor return type 'Super & {}' is not a class or interface type.
Große Erklärung, Vielen Dank. Tracking https://github.com/Microsoft/TypeScript/issues/4890 jetzt. – trefeater
In https://github.com/therror/therror wird dies durch den Export der Shapes für die zurückgegebenen mixin-Klassen erreicht, und der Entwickler muss die neue Form im Code https://github.com/therror/therror definieren # typescript-Einschränkungen – trefeater