2016-09-10 25 views
5

ES6 mix-in için Typescript açıklaması yapmanın bir yolu var mı?ES6 mixins için tanım bilgileri

ben library.js bu desen ettik ve ben 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) {} 

cevap

4

Hayır, typescript tipi sistemini oluşturmak istiyorum bunun için yeterince anlamlı değildir - https://github.com/Microsoft/TypeScript/issues/7225 ve https://github.com/Microsoft/TypeScript/issues/4890 tartışmaya bakınız.

daktilo deyimsel 'sınıfların tipi' oluştur'da için deklarasyon yazmak için

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

Yani bir yolu olarak yazılır dönüş tipi bir olduğu açıklanarak oluturunuz olan

export declare class Simple {} 

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

olduğunu kesişim türü için kurucu - karışımın tüm özellikleriyle birlikte parametrenin (Taban) tüm özelliklerine sahip olması gereken bir tür. O beyanı kullanabilirsiniz

bu

import {Super} from './library' 

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

küçük rahatsızlık gibi (o library.d.ts dosyasında olduğu varsayımıyla) her zaman Super.Compose() tür kesmesi nedeniyle için argüman sağlamak zorunda olmasıdır varsayılan parametrenin değerini bilmeden çalışmaz ve bildirim dosyasında varsayılan parametre için değer sağlayamazsınız. ,

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

Büyük açıklama: nedeniyle yukarıda belirtilen hususlara

class MyClass extends Super.Compose(Super) {} 

derlemek değildir:

Ama büyük sorun gerçekten bir sınıf olarak Compose sonucunu kullanamaz olmasıdır Teşekkürler. Https://github.com/Microsoft/TypeScript/issues/4890 adresini şimdi takip edin. – trefeater

+0

https://github.com/therror/therror adresinde, bu, döndürülen sınıfların mixine ilişkin şekillerin dışa aktarılmasıyla elde edilir ve geliştiricinin yeni şekli https://github.com/therror/therror kodunda tanımlaması gerekir. # typescript-sınırlamalar – trefeater