/* eslint-disable max-len, import/export, no-use-before-define */ import Vue, { VueConstructor } from 'vue' export default function mixins (...args: T): ExtractVue extends infer V ? V extends Vue ? VueConstructor : never : never export default function mixins (...args: VueConstructor[]): VueConstructor export default function mixins (...args: VueConstructor[]): VueConstructor { return Vue.extend({ mixins: args }) } /** * Returns the instance type from a VueConstructor * Useful for adding types when using mixins().extend() */ export type ExtractVue = T extends (infer U)[] ? UnionToIntersection< U extends VueConstructor ? V : never > : T extends VueConstructor ? V : never type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never