From 6513f0804330603b3414b604339dae7b035acf89 Mon Sep 17 00:00:00 2001 From: "M.Cozzolino" Date: Tue, 8 Apr 2025 22:48:55 +0200 Subject: [PATCH 1/6] feat(types): Add Exposed template to SetupContext --- packages/runtime-core/src/component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 3ed42ed0b55..39372309124 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -278,12 +278,13 @@ export type LifecycleHook = (TFn & SchedulerJob)[] | null export type SetupContext< E = EmitsOptions, S extends SlotsType = {}, + EX extends Record = Record, > = E extends any ? { attrs: Data slots: UnwrapSlotsType emit: EmitFn - expose: = Record>( + expose: = EX>( exposed?: Exposed, ) => void } From 040b0f3f272141956d03677acc80519a67ccdc21 Mon Sep 17 00:00:00 2001 From: "M.Cozzolino" Date: Tue, 8 Apr 2025 23:35:43 +0200 Subject: [PATCH 2/6] feat(types): Add Exposed template to SetupContext where it is used --- packages/runtime-core/src/apiDefineComponent.ts | 6 ++++-- packages/runtime-core/src/component.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index 2ce870f0141..a7f83e4957a 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -151,10 +151,11 @@ export function defineComponent< E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, + Exposed extends Record = Record, >( setup: ( props: Props, - ctx: SetupContext, + ctx: SetupContext, ) => RenderFunction | Promise, options?: Pick & { props?: (keyof Props)[] @@ -167,10 +168,11 @@ export function defineComponent< E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, + Exposed extends Record = Record, >( setup: ( props: Props, - ctx: SetupContext, + ctx: SetupContext, ) => RenderFunction | Promise, options?: Pick & { props?: ComponentObjectPropsOptions diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 39372309124..9ab72183dce 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -217,11 +217,12 @@ export interface FunctionalComponent< E extends EmitsOptions | Record = {}, S extends Record = any, EE extends EmitsOptions = ShortEmitsToObject, + Exposed extends Record = Record, > extends ComponentInternalOptions { // use of any here is intentional so it can be a valid JSX Element constructor ( props: P & EmitsToProps, - ctx: Omit>>, 'expose'>, + ctx: Omit>, Exposed>, 'expose'>, ): any props?: ComponentPropsOptions

emits?: EE | (keyof EE)[] From c6f2f3658f2d806ad62394018051c8d0ac1f8fa0 Mon Sep 17 00:00:00 2001 From: "M.Cozzolino" Date: Sat, 12 Apr 2025 21:14:45 +0200 Subject: [PATCH 3/6] feat(types): Improve expose typing --- .../runtime-core/src/apiDefineComponent.ts | 30 +++++++++++++++---- packages/runtime-core/src/component.ts | 4 +-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/runtime-core/src/apiDefineComponent.ts b/packages/runtime-core/src/apiDefineComponent.ts index a7f83e4957a..23520c98ec7 100644 --- a/packages/runtime-core/src/apiDefineComponent.ts +++ b/packages/runtime-core/src/apiDefineComponent.ts @@ -118,6 +118,7 @@ export type DefineSetupFnComponent< S extends SlotsType = SlotsType, Props = P & EmitsToProps, PP = PublicProps, + Exposed extends string = string, > = new ( props: Props & PP, ) => CreateComponentPublicInstanceWithMixins< @@ -133,7 +134,10 @@ export type DefineSetupFnComponent< {}, false, {}, - S + S, + {}, + {}, + Exposed > type ToResolvedProps = Readonly & @@ -157,12 +161,20 @@ export function defineComponent< props: Props, ctx: SetupContext, ) => RenderFunction | Promise, - options?: Pick & { + options?: Pick & { props?: (keyof Props)[] emits?: E | EE[] slots?: S + expose?: (keyof Exposed)[] }, -): DefineSetupFnComponent +): DefineSetupFnComponent< + Props, + E, + S, + Props & EmitsToProps, + PublicProps, + Extract +> export function defineComponent< Props extends Record, E extends EmitsOptions = {}, @@ -174,12 +186,20 @@ export function defineComponent< props: Props, ctx: SetupContext, ) => RenderFunction | Promise, - options?: Pick & { + options?: Pick & { props?: ComponentObjectPropsOptions emits?: E | EE[] slots?: S + expose?: (keyof Exposed)[] }, -): DefineSetupFnComponent +): DefineSetupFnComponent< + Props, + E, + S, + Props & EmitsToProps, + PublicProps, + Extract +> // overload 2: defineComponent with options object, infer props from options export function defineComponent< diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 9ab72183dce..6b7e00b56fd 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -285,9 +285,7 @@ export type SetupContext< attrs: Data slots: UnwrapSlotsType emit: EmitFn - expose: = EX>( - exposed?: Exposed, - ) => void + expose: (exposed?: Exposed) => void } : never From c202914a3885f85a48cbc91dfe9016076b325fae Mon Sep 17 00:00:00 2001 From: "M.Cozzolino" Date: Sat, 12 Apr 2025 21:23:44 +0200 Subject: [PATCH 4/6] feat(defineComponent): Add expose typing tests when using setup function --- packages/runtime-core/src/component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 6b7e00b56fd..bac3c0ab329 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -222,11 +222,12 @@ export interface FunctionalComponent< // use of any here is intentional so it can be a valid JSX Element constructor ( props: P & EmitsToProps, - ctx: Omit>, Exposed>, 'expose'>, + ctx: SetupContext>, Exposed>, ): any props?: ComponentPropsOptions

emits?: EE | (keyof EE)[] slots?: IfAny> + expose?: (keyof Exposed)[] inheritAttrs?: boolean displayName?: string compatConfig?: CompatConfig From aca9d7143eb4a6942d39a9b54820e27948046c96 Mon Sep 17 00:00:00 2001 From: "M.Cozzolino" Date: Sat, 12 Apr 2025 21:30:52 +0200 Subject: [PATCH 5/6] feat(defineComponent): Add expose typing tests when using setup function --- .../dts-test/defineComponent.test-d.tsx | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/packages-private/dts-test/defineComponent.test-d.tsx b/packages-private/dts-test/defineComponent.test-d.tsx index fda3ca4856c..b64fceaf2ea 100644 --- a/packages-private/dts-test/defineComponent.test-d.tsx +++ b/packages-private/dts-test/defineComponent.test-d.tsx @@ -1613,7 +1613,7 @@ describe('directive typing', () => { expectType(comp.directives!.vShow) }) -describe('expose typing', () => { +describe('expose typing w/ options object', () => { const Comp = defineComponent({ expose: ['a', 'b'], props: { @@ -1637,6 +1637,41 @@ describe('expose typing', () => { vm.c }) +describe('expose typing w/ setup function', () => { + const Comp = defineComponent( + ( + props: { some: String }, + { + expose, + }: SetupContext, + ) => { + const a = 1 + const b = '2' + const c = 3 + + expose({ a, b }) + + return () => h('div') + }, + { + props: ['some'], + expose: ['a', 'b'], + }, + ) + + expectType>(Comp.expose!) + + const vm = new Comp({ some: 'string' }) + // internal should still be exposed + vm.$props + + expectType(vm.a) + expectType(vm.b) + + // @ts-expect-error shouldn't be exposed + vm.c +}) + import type { AllowedComponentProps, ComponentCustomProps, From f08fd5aeefa9de9041339eb2d8040b082b6bea28 Mon Sep 17 00:00:00 2001 From: "M.Cozzolino" Date: Sat, 12 Apr 2025 21:31:41 +0200 Subject: [PATCH 6/6] feat(defineComponent): Add expose typing tests when using setup function --- packages/runtime-core/src/component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index bac3c0ab329..60d53a14019 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -222,7 +222,7 @@ export interface FunctionalComponent< // use of any here is intentional so it can be a valid JSX Element constructor ( props: P & EmitsToProps, - ctx: SetupContext>, Exposed>, + ctx: Omit>>, 'expose'>, ): any props?: ComponentPropsOptions

emits?: EE | (keyof EE)[]