mix-classes
Version:
Seamlessly combine class inheritance with composition, guaranteed to work with any class
20 lines (19 loc) • 1.13 kB
TypeScript
import { IGeneric } from './Generic';
declare type NewableParameters<T extends any> = T extends new (...args: infer P) => any ? P : never;
export interface Constructable {
new (...args: any): any;
prototype: any;
}
export declare type Mixable = Constructable | IGeneric;
declare type ExtractConstructable<TMixable extends Mixable> = TMixable extends IGeneric<infer TConstructable> ? TConstructable : TMixable;
declare type MixinParameters<TMixables extends Mixable[]> = {
[K in keyof TMixables]?: TMixables[K] extends Mixable ? NewableParameters<ExtractConstructable<TMixables[K]>> : TMixables[K];
};
declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
declare type MixinInstance<TMixables extends Mixable[]> = {
[K in keyof TMixables]: TMixables[K] extends Constructable ? TMixables[K] : never;
}[number]['prototype'];
export interface Mixin<TMixables extends Mixable[]> {
new (...args: MixinParameters<TMixables>): MixinInstance<TMixables> extends never ? {} : UnionToIntersection<MixinInstance<TMixables>>;
}
export {};