2016-11-08 62 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