打字稿子类工厂

Typescript subclass factory

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

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 中不可能像这样参数化超类吗?

它不适用于泛型(至少,我无法让它工作):

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

因为它需要一个具体的class,所以你可以为所有你想用这个mixin使用的classes设置一个基础class:

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)