ES6 Mixin with a generic type in TypeScript

I am trying to use ES6 Mixin in TypeScript. What I have is below and it works fine with BaseClass.

class BaseClass {
    public foo() {}
};

interface IMyMixin {
    foo2();
}

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

class MyBaseClass extends MyMixin(BaseClass) {

}

However, I cannot apply MyMixinto a derived class from BaseClass; Meanwhile, I cannot create a common mixing set.

Is there a way to make it work for both BaseClass, and DerivedClass?

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() {}
}
+4
source share
1 answer

I found a solution from TypeScript / PR # 13743 and optimized it with a comment from @Maximus.

. , MyMixin, T Class (.. ), .

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();
    }
}
+1

Source: https://habr.com/ru/post/1673468/


All Articles