vue-facing-decorator
Version:
Vue typescript class and decorator based component.
29 lines (21 loc) • 872 B
text/typescript
import { ComponentBase } from './component'
import { obtainSlot } from './slot'
import type { VueCons } from './class'
import { Base as Vue } from './class'
import type { MergeIdentityType, IdentitySymbol } from './identity'
type MixedClass<Mixins extends VueCons[], Base extends VueCons = VueCons> =
Mixins extends [infer T extends VueCons, ...infer E extends VueCons[]] ?
MixedClass<E,
VueCons<InstanceType<Base> & InstanceType<T>,
MergeIdentityType<InstanceType<T>[typeof IdentitySymbol], InstanceType<Base>[typeof IdentitySymbol]>
>
> :
Base
export function mixins<T extends VueCons[]>(...conses: T) {
class MixinsClass extends Vue {
}
ComponentBase({
mixins: conses.map((cons => obtainSlot(cons.prototype).cachedVueComponent))
})(MixinsClass)
return MixinsClass as any as MixedClass<T>
}