2016-09-10 12 views
5

Gibt es eine Möglichkeit, eine Typoskript-Definition für eine ES6 mix-in zu schreiben?Typescript-Definition für ES6-Mixins

Ich habe dieses Muster in library.js, und ich mag das library.d.ts

// declaration in `library.js` 
class Super extends Simple { 
    constructor() {} 

    static Compose(Base = Super) { 
     return class extends Base { 
      // ...  
     } 

    } 
} 

// usage in `client.js` 
class MyClass extends Super.Compose() {} 
let myInstance = new MyClass(); 

class MyOtherClass extends Super.Compose(AnotherClass) {} 

Antwort

4

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. 
+0

Große Erklärung, Vielen Dank. Tracking https://github.com/Microsoft/TypeScript/issues/4890 jetzt. – trefeater

+0

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

Verwandte Themen