export type Constructor = new (...args: any[]) => T; export interface Initable { init(...args: any[]): void; } /** * Plain mixin where the superclass must be Initable */ export const Serializable = & Initable>( SuperClass: K ) => { const LocalMixin = (InnerSuperClass: K) => { return class SerializableLocal extends InnerSuperClass { } }; let ResultClass = LocalMixin(SuperClass); return ResultClass; }; const AMixin = & Initable>(SuperClass: K) => { let SomeHowOkay = class A extends SuperClass { }; let SomeHowNotOkay = class A extends Serializable(SuperClass) { }; };