comment
- 저장용
global.d.ts
type Constructor<T = object> = new (...args: any[]) => T;
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
mixin.ts
function applyMixin<D, T>(derived: Constructor<D>, target: Constructor<T>) {
    const proto = Object.getPrototypeOf(target);
    Object.getOwnPropertyNames(proto).forEach((name) => {
        Reflect.defineProperty(
            derived.prototype,
            name,
            Reflect.getOwnPropertyDescriptor(proto, name) || Object.create(null),
        );
    });
}
export function mixin<D, T>(derived: Constructor<D>, target: Constructor<T>): Constructor<D & T>;
export function mixin<T extends Constructor[]>(...constructors: [...T]): Constructor<UnionToIntersection<InstanceType<T[number]>>> {
    const derived = constructors[0];
    if (!derived) throw new Error('1 argument required, but only 0 present.');
    for (let i = 1; i < constructors.length; i++) {
        const target = constructors[i];
        applyMixin(derived, target);
    }
    return derived as any;
}
Reference
