import { Component } from '../component' interface ComponentConstructor { new (): This } interface ComponentConstructorWithMixins { new

(): This & { $data: D } & D & { $props: Readonly

} & P } // mind = blown // https://stackoverflow.com/questions/50374908/transform-union-type-to-intersection-type type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never type ExtractInstance = T extends (infer U)[] ? UnionToIntersection ? V : never> : never export function mixins< T extends ComponentConstructor[] = [], V = ExtractInstance >(...args: T): ComponentConstructorWithMixins export function mixins(...args: any[]): any { // TODO } /* Example usage class Foo extends Component<{ foo: number }> { test() { } } class Bar extends Component<{ bar: string }> { ok() { } } class Baz extends mixins(Foo, Bar)<{ baz: number }> { created() { this.foo this.bar this.baz this.test() this.ok() } } */