]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: mixins
authorEvan You <yyx990803@gmail.com>
Mon, 15 Oct 2018 23:07:06 +0000 (19:07 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 15 Oct 2018 23:07:06 +0000 (19:07 -0400)
packages/core/src/componentUtils.ts
packages/core/src/optional/mixin.ts

index 0aebc6b3422c70a58016e969bb1674258e44db7f..8893a905b3bc0e64d9b956a85d6fead7dd8a21cb 100644 (file)
@@ -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) {
index 605075c0a801e4f84269899b6b1a3c6f76672db8..152aba376bbe7d5025317eb12836f8a858c71102 100644 (file)
@@ -1,6 +1,48 @@
-import { ComponentInstance } from '../component'
-import { ComponentOptions } from '../componentOptions'
+import { Component } from '../component'
 
-export interface Mixin extends ComponentOptions {}
+interface ComponentConstructor<This = Component> {
+  new (): This
+}
 
-export function applyMixins(Component: ComponentInstance, mixins: Mixin[]) {}
+// mind = blown
+type UnionToIntersection<U> = (U extends any
+  ? (k: U) => void
+  : never) extends ((k: infer I) => void)
+  ? I
+  : never
+
+type ExtractInstance<T> = T extends (infer U)[]
+  ? UnionToIntersection<U extends ComponentConstructor<infer V> ? V : never>
+  : never
+
+function mixins<T extends ComponentConstructor[], V = ExtractInstance<T>>(
+  ...args: T
+): ComponentConstructor<V>
+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()
+  }
+}
+
+*/