Skip to content

Commit

Permalink
feat: make mixins function argument variadic
Browse files Browse the repository at this point in the history
  • Loading branch information
ktsn committed Nov 11, 2019
1 parent 513aff1 commit 2923163
Showing 1 changed file with 15 additions and 61 deletions.
76 changes: 15 additions & 61 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,67 +2,21 @@ import Vue, { VueConstructor } from 'vue'

export type VueClass<T> = VueConstructor<T & Vue>

export default function mixins<A>(Ctor1: VueClass<A>): VueClass<A>
export default function mixins<A, B>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>
): VueClass<A & B>
export default function mixins<A, B, C>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>
): VueClass<A & B & C>
export default function mixins<A, B, C, D>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>,
Ctor4: VueClass<D>
): VueClass<A & B & C & D>
export default function mixins<A, B, C, D, E>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>,
Ctor4: VueClass<D>,
Ctor5: VueClass<E>
): VueClass<A & B & C & D & E>
export default function mixins<A, B, C, D, E, F>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>,
Ctor4: VueClass<D>,
Ctor5: VueClass<E>,
Ctor6: VueClass<F>
): VueClass<A & B & C & D & E & F>
export default function mixins<A, B, C, D, E, F, G>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>,
Ctor4: VueClass<D>,
Ctor5: VueClass<E>,
Ctor6: VueClass<F>,
Ctor7: VueClass<G>
): VueClass<A & B & C & D & E & F & G>
export default function mixins<A, B, C, D, E, F, G, H>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>,
Ctor4: VueClass<D>,
Ctor5: VueClass<E>,
Ctor6: VueClass<F>,
Ctor7: VueClass<G>,
Ctor8: VueClass<H>
): VueClass<A & B & C & D & E & F & G & H>
export default function mixins<A, B, C, D, E, F, G, H, I>(
Ctor1: VueClass<A>,
Ctor2: VueClass<B>,
Ctor3: VueClass<C>,
Ctor4: VueClass<D>,
Ctor5: VueClass<E>,
Ctor6: VueClass<F>,
Ctor7: VueClass<G>,
Ctor8: VueClass<H>,
Ctor9: VueClass<I>
): VueClass<A & B & C & D & E & F & G & H & I>
type UnionToIntersection<U> = (U extends any
? (k: U) => void
: never) extends (k: infer I) => void
? I
: never

export type MixedVueConstructor<
Ctors extends VueConstructor[]
> = Ctors extends VueConstructor<infer Vs>[]
? VueClass<UnionToIntersection<Vs>>
: never

export default function mixins<Ctors extends VueConstructor[]>(
...Ctors: Ctors
): MixedVueConstructor<Ctors>
export default function mixins(...Ctors: VueConstructor[]): VueConstructor {
return Vue.extend({ mixins: Ctors })
}

0 comments on commit 2923163

Please sign in to comment.