ES6与TypeScript中的泛型类型混合

ES6与TypeScript中的泛型类型混合,typescript,ecmascript-6,mixins,Typescript,Ecmascript 6,Mixins,我正在尝试在TypeScript中使用ES6 Mixin。我所拥有的如下所示,它与基类完美结合 class BaseClass { public foo() {} }; interface IMyMixin { foo2(); } let MyMixin = (superclass: typeof BaseClass) => class extends BaseClass implements IMyMixin { public foo2() {} } cla

我正在尝试在TypeScript中使用ES6 Mixin。我所拥有的如下所示,它与
基类
完美结合

class BaseClass {
    public foo() {}
};

interface IMyMixin {
    foo2();
}

let MyMixin = (superclass: typeof BaseClass) => class extends BaseClass implements IMyMixin {
    public foo2() {}
}

class MyBaseClass extends MyMixin(BaseClass) {

}
但是,我不能将
MyMixin
应用于来自
BaseClass
的派生类;同时,我也不能让mixin通用

有没有办法让它同时适用于
基类
派生类

class DerivedClass extends BaseClass {
    public bar() {}
}

class MyDerivedClass extends MyMixin(DerivedClass) {
    public something() {
// Compile Error: Property 'bar' does not exist on type 'MyDerivedClass'
        this.bar();
    }
}

// Compile Error: 'T' only refers to a type, but is being used as a value here.
let MyMixin = <T extends BaseClass>(superclass: typeof T) => class extends T implements IMyMixin {
    public foo2() {}
}
class-DerivedClass扩展了基类{
公共栏(){}
}
类MyDerivedClass扩展了MyMixin(DerivedClass){
公开某事{
//编译错误:类型“MyDerivedClass”上不存在属性“bar”
这个.bar();
}
}
//编译错误:“T”仅引用类型,但在此处用作值。
让MyMixin=(超类:typeof T)=>类扩展T实现IMyMixin{
公共foo2(){}
}
我从中找到了解决方案,并通过@Maximus的评论对其进行了优化

这段代码有效。原因是,在
MyMixin
中,
T
应该是
类(即构造函数),而不是类型

type Constructor<T> = new (...args: any[]) => T;

class BaseClass {
    public foo() { }
};

interface IMyMixin {
    foo2();
}

// `implements IMyMixin` is optional.
let MyMixin = <T extends Constructor<BaseClass>>(superclass: T) => class extends superclass implements IMyMixin {
    public foo2() { }
}

class DerivedClass extends BaseClass {
    public bar() {}
}

class MyDerivedClass extends MyMixin(DerivedClass) {
    public something() {
        this.bar();
        this.foo();
        this.foo2();
    }
}
type构造函数=new(…args:any[])=>T;
类基类{
公共foo(){}
};
接口IMyMixin{
foo2();
}
//'implements IMyMixin'是可选的。
让MyMixin=(超类:T)=>类扩展超类实现IMyMixin{
公共foo2(){}
}
类DerivedClass扩展了基类{
公共栏(){}
}
类MyDerivedClass扩展了MyMixin(DerivedClass){
公开某事{
这个.bar();
this.foo();
这是foo2();
}
}

您是否打算编写
类扩展超类实现IMyMixin
而不是
类扩展基类实现IMyMixin
?否则,
MyMixin
工厂中不使用
superclass
变量function@Maximus非常感谢,我没有意识到
超类
可以用于返回类型。