2016-09-10 33 views
5

Czy istnieje sposób napisania definicji maszynopisu dla ES6 mix-in?Definicja maszynopisu dla miksów ES6

mam ten wzór w library.js, i chciałbym, aby utworzyć 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) {} 

Odpowiedz

4

Nie, system typu Maszynopis nie jest na tyle wyrazisty, że za - patrz dyskusja w https://github.com/Microsoft/TypeScript/issues/7225 i https://github.com/Microsoft/TypeScript/issues/4890.

idiomatyczne „typ zajęć” w maszynopisie jest napisane jak

interface Constructor<T> { 
    new (...args): T; 
} 

więc jeden sposób, aby napisać oświadczenie dla Compose jest

export declare class Simple {} 

export declare class Super extends Simple { 
    static Compose<T>(Base?: Constructor<T>): Constructor<T & {/*mixed-in declarations*/}> 
} 

Oznacza to, że Skomponuj typ zwracany jest uznany za konstruktor dla typu przecięcia - typ, który musi mieć wszystkie właściwości parametru (Base) wraz ze wszystkimi właściwościami mixin.

Możesz użyć tej deklaracji (zakładając, że w pliku library.d.ts) jak to

import {Super} from './library' 

let MyComposed = Super.Compose(Super) 
let myInstance = new MyComposed 

małoletniego niedogodności jest to, że zawsze trzeba dostarczyć argumentu dla Super.Compose(), ponieważ typ wnioskowania nie działa bez znajomości wartości dla parametru domyślnego i nie można podać wartości dla parametru domyślnego w pliku deklaracji.

Jednak dużym problemem jest to, że naprawdę nie można użyć wyniku Compose jako klasa:

class MyClass extends Super.Compose(Super) {} 

nie skompilować z powodu wyżej wymienionych zagadnień:

error TS2509: Base constructor return type 'Super & {}' is not a class or interface type. 
+0

Wielkiej wyjaśnienia dzięki. Śledzenie https://github.com/Microsoft/TypeScript/issues/4890 teraz. – trefeater

+0

W https://github.com/therror/therror osiąga się to przez eksportowanie kształtów dla zwróconych klas mixin, a programista musi zdefiniować nowy kształt w kodzie https://github.com/therror/therror # ograniczenia maszynopisu – trefeater