From 2a389ed2c395795993192aaf24fa195b00339b41 Mon Sep 17 00:00:00 2001 From: Kael Date: Wed, 20 Mar 2024 23:45:17 +1100 Subject: [PATCH] emit types --- .../api-generator/templates/directives.d.ts | 8 ++++-- .../src/composables/directiveComponent.ts | 19 ++++++++++--- packages/vuetify/src/util/defineComponent.tsx | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/api-generator/templates/directives.d.ts b/packages/api-generator/templates/directives.d.ts index 94eb580b2a5..a7ee062adb8 100644 --- a/packages/api-generator/templates/directives.d.ts +++ b/packages/api-generator/templates/directives.d.ts @@ -1,4 +1,4 @@ -import type { DirectiveBinding } from 'vue' +import type { DirectiveBinding, ObjectDirective } from 'vue' import type * as directives from '../../vuetify/lib/directives/index.d.mts' type ExtractDirectiveBindings = T extends object @@ -11,7 +11,11 @@ type ExtractDirectiveBindings = T extends object } : never : never - : {} + : T[K] extends ObjectDirective + ? B extends object + ? { value: B, modifiers: {} } + : never + : never } : never diff --git a/packages/vuetify/src/composables/directiveComponent.ts b/packages/vuetify/src/composables/directiveComponent.ts index 352e9a775a2..d3a9753a13d 100644 --- a/packages/vuetify/src/composables/directiveComponent.ts +++ b/packages/vuetify/src/composables/directiveComponent.ts @@ -11,11 +11,22 @@ import type { ObjectDirective, VNode, } from 'vue' +import type { ComponentInstance } from '@/util' -export const useDirectiveComponent = ( - component: string | Component, - props?: any -): ObjectDirective => { +type ExcludeProps = + | 'v-slots' + | `v-slot:${string}` + | `on${Uppercase}${string}` + | 'key' + | 'ref' + | 'ref_for' + | 'ref_key' + | '$children' + +export const useDirectiveComponent = < + C extends Component, + Props = Omit['$props'], ExcludeProps> +>(component: string | C, props?: any): ObjectDirective => { const concreteComponent = (typeof component === 'string' ? resolveComponent(component) : component) as ConcreteComponent diff --git a/packages/vuetify/src/util/defineComponent.tsx b/packages/vuetify/src/util/defineComponent.tsx index 7753afd4673..fee604b39f4 100644 --- a/packages/vuetify/src/util/defineComponent.tsx +++ b/packages/vuetify/src/util/defineComponent.tsx @@ -12,6 +12,7 @@ import { propsFactory } from '@/util/propsFactory' // Types import type { AllowedComponentProps, + Component, ComponentCustomProps, ComponentInjectOptions, ComponentObjectPropsOptions, @@ -20,6 +21,7 @@ import type { ComponentOptionsWithObjectProps, ComponentOptionsWithoutProps, ComponentPropsOptions, + ComponentPublicInstance, ComputedOptions, DefineComponent, EmitsOptions, @@ -299,3 +301,29 @@ export interface FilterPropsOptions> > (props: T): Partial> } + +// https://github.com/vuejs/core/pull/10557 +export type ComponentInstance = T extends { new (): ComponentPublicInstance } + ? InstanceType + : T extends FunctionalComponent + ? ComponentPublicInstance> + : T extends Component< + infer Props, + infer RawBindings, + infer D, + infer C, + infer M + > + ? // NOTE we override Props/RawBindings/D to make sure is not `unknown` + ComponentPublicInstance< + unknown extends Props ? {} : Props, + unknown extends RawBindings ? {} : RawBindings, + unknown extends D ? {} : D, + C, + M + > + : never // not a vue Component + +type ShortEmitsToObject = E extends Record ? { + [K in keyof E]: (...args: E[K]) => any; +} : E;