From 3a7d11ca153ba84bb2f0bae430b6c79224b3f9d4 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 15 Oct 2018 19:07:06 -0400 Subject: [PATCH] wip: mixins --- packages/core/src/componentUtils.ts | 7 ++-- packages/core/src/optional/mixin.ts | 50 ++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/packages/core/src/componentUtils.ts b/packages/core/src/componentUtils.ts index 0aebc6b342..8893a905b3 100644 --- a/packages/core/src/componentUtils.ts +++ b/packages/core/src/componentUtils.ts @@ -62,9 +62,7 @@ export function initializeComponentInstance(instance: ComponentInstance) { ) } - instance.$options = - instance.constructor.options || - resolveComponentOptions(instance.constructor) + instance.$options = resolveComponentOptions(instance.constructor) instance.$parentVNode = currentVNode as MountedVNode // renderProxy @@ -262,6 +260,9 @@ export function createComponentClassFromOptions( export function resolveComponentOptions( Component: ComponentClass ): ComponentOptions { + if (Component.options) { + return Component.options + } const descriptors = Object.getOwnPropertyDescriptors(Component) const options = {} as any for (const key in descriptors) { diff --git a/packages/core/src/optional/mixin.ts b/packages/core/src/optional/mixin.ts index 605075c0a8..152aba376b 100644 --- a/packages/core/src/optional/mixin.ts +++ b/packages/core/src/optional/mixin.ts @@ -1,6 +1,48 @@ -import { ComponentInstance } from '../component' -import { ComponentOptions } from '../componentOptions' +import { Component } from '../component' -export interface Mixin extends ComponentOptions {} +interface ComponentConstructor { + new (): This +} -export function applyMixins(Component: ComponentInstance, mixins: Mixin[]) {} +// mind = blown +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 + +function mixins>( + ...args: T +): ComponentConstructor +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) { + created() { + this.foo + this.bar + this.test() + this.ok() + } +} + +*/ -- 2.47.3