1// @declaration: true 2// @Filename:BaseClass.ts 3export type Constructor<T> = new (...args: any[]) => T; 4 5export class MyBaseClass<T> { 6 baseProperty: string; 7 constructor(value: T) {} 8} 9// @Filename:MixinClass.ts 10import { Constructor, MyBaseClass } from './BaseClass'; 11 12export interface MyMixin { 13 mixinProperty: string; 14} 15 16export function MyMixin<T extends Constructor<MyBaseClass<any>>>(base: T): T & Constructor<MyMixin> { 17 return class extends base { 18 mixinProperty: string; 19 } 20} 21// @Filename:FinalClass.ts 22import { MyBaseClass } from './BaseClass'; 23import { MyMixin } from './MixinClass'; 24 25export class MyExtendedClass extends MyMixin(MyBaseClass)<string> { 26 extendedClassProperty: number; 27} 28// @Filename:Main.ts 29import { MyExtendedClass } from './FinalClass'; 30import { MyMixin } from './MixinClass'; 31 32const myExtendedClass = new MyExtendedClass('string'); 33 34const AnotherMixedClass = MyMixin(MyExtendedClass); 35