打字稿子类工厂

时间:2016-11-08 00:27:19

标签: javascript typescript mixins

我最近阅读了一篇关于javascript mixins as subclass factories的文章,该文章提出了以下创建mixins的模式:

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

然后可以按如下方式使用:

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

我想知道这是否适用于TypeScript,但我收到以下错误:

  

错误TS2507:类型“any”不是构造函数类型。

虽然它仍然会编译成正常工作的javascript,但我所做的一切都不会消除这个错误。

非常感谢任何建议。在TypeScript中参数化这样的超类是不可能的吗?

1 个答案:

答案 0 :(得分: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

话说:

  

基础构造函数返回类型“T”不是类或接口类型

因为它需要一个具体的类,你可以为你想要用于这个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