interface IBase {
baseProp?: string;
}
class Base implements IBase {
baseProp: string = "baseProp";
}
type AnyClass<T> = new () => T;
interface IClass1 extends IBase {
class1Prop?: string;
}
const Class1Mixin = (MixedClasses: AnyClass<any>): AnyClass<IClass1> =>
class extends MixedClasses implements IClass1 {
class1Prop: string = "class1Prop";
};
interface IClass2 extends IBase {
class2Prop?: string;
}
const Class2Mixin = (MixedClasses: AnyClass<any>): AnyClass<IClass2> =>
class extends MixedClasses implements IClass2 {
class2Prop: string = "class2Prop";
};
// Mix classes
const mix = <T>(...extensions: Array<(anyClass: any) => AnyClass<T>>) => {
let Composition = Base as AnyClass<IBase>;
for (const ext of extensions) {
Composition = ext(Composition);
}
return Composition as AnyClass<T>;
};
// Here can be any number of classes
const Mixed = mix(Class1Mixin, Class2Mixin);
const mixedInit = new Mixed();
// Now mixedInit is IBase & ICLass1
// and I need that it will be IBase & ICLass1 & ICLass2
console.log(mixedInit.baseProp, mixedInit.class1Prop, mixedInit.class2Prop);
I have a function that mixes any number of classes all together with Base class. But I couldn't mix interfaces of theses classes. Please tell me how can I improve mix function types to do that?