UNPKG

mix-classes

Version:

Seamlessly combine class inheritance with composition, guaranteed to work with any class

20 lines (19 loc) 1.13 kB
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 {};