2016-11-08 80 views
0

我最近讀javascript mixins as subclass factories的文章,其中提出了以下模式創建的混入:打字稿子工廠

let MyMixin = (superclass) => class extends superclass { 
    foo() { 
    console.log('foo from MyMixin'); 
    } 
}; 

然後可以使用如下:

class MyClass extends MyMixin(MyBaseClass) { 
    /* ... */ 
} 

我想看看這工作在TypeScript,但我得到以下錯誤:但我得到以下錯誤:

error TS2507: Type 'any' is not a constructor function type.

雖然它仍然會編譯成工作的JavaScript,沒有我會擺脫這個錯誤。

任何意見將非常感激。在TypeScript中參數化這樣的超類是不可能的嗎?

回答

0

它不與仿製藥的工作(至少,我不能使它工作):

type SuperclassConstructor<T> = { new(): T }; 

let MyMixin = <T>(superclass: SuperclassConstructor<T>) => { 
    return class extends superclass { 
     foo() { 
      console.log('foo from MyMixin'); 
     } 
    }; 
} 

code in playground

說:

Base constructor return type 'T' is not a class or interface type

因爲它需要一個具體的類,你可以只爲你想用這個mixin的所有類設置一個基類:

class Base { } 
type SuperclassConstructor = { new(): Base }; 

let MyMixin = (superclass: SuperclassConstructor) => { 
    return class extends superclass { 
     foo() { 
      console.log('foo from MyMixin'); 
     } 
    }; 
} 

class MyBaseClass extends Base {} 

class MyClass extends MyMixin(MyBaseClass) { 
    /* ... */ 
} 

code in playground