• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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