From d7d0371e74707ee601020f67de88e091cdae2673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=B1=E5=90=B9=E8=89=B2=E5=BE=A1=E5=AE=88?= <85992002+KazariEX@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:49:43 +0800 Subject: [PATCH] fix(runtime-core): correct type inference for PascalCase emits (#11579) fix vuejs/language-tools#4269 --- .../dts-test/defineComponent.test-d.tsx | 15 +++++++++++++++ packages/runtime-core/src/componentEmits.ts | 16 +++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/packages-private/dts-test/defineComponent.test-d.tsx b/packages-private/dts-test/defineComponent.test-d.tsx index 810310bac..79ce6d695 100644 --- a/packages-private/dts-test/defineComponent.test-d.tsx +++ b/packages-private/dts-test/defineComponent.test-d.tsx @@ -906,12 +906,15 @@ describe('emits', () => { emits: { click: (n: number) => typeof n === 'number', input: (b: string) => b.length > 1, + Focus: (f: boolean) => !!f, }, setup(props, { emit }) { expectType<((n: number) => boolean) | undefined>(props.onClick) expectType<((b: string) => boolean) | undefined>(props.onInput) + expectType<((f: boolean) => boolean) | undefined>(props.onFocus) emit('click', 1) emit('input', 'foo') + emit('Focus', true) // @ts-expect-error emit('nope') // @ts-expect-error @@ -922,6 +925,10 @@ describe('emits', () => { emit('input') // @ts-expect-error emit('input', 1) + // @ts-expect-error + emit('focus') + // @ts-expect-error + emit('focus', true) }, created() { this.$emit('click', 1) @@ -936,6 +943,10 @@ describe('emits', () => { this.$emit('input') // @ts-expect-error this.$emit('input', 1) + // @ts-expect-error + this.$emit('focus') + // @ts-expect-error + this.$emit('focus', true) }, mounted() { // #3599 @@ -954,6 +965,10 @@ describe('emits', () => { this.$emit('input') // @ts-expect-error this.$emit('input', 1) + // @ts-expect-error + this.$emit('focus') + // @ts-expect-error + this.$emit('focus', true) }) }, }) diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index 4c3912e05..dddb2e945 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -47,15 +47,13 @@ export type EmitsToProps = } : T extends ObjectEmitsOptions ? { - [K in `on${Capitalize}`]?: K extends `on${infer C}` - ? ( - ...args: T[Uncapitalize] extends (...args: infer P) => any - ? P - : T[Uncapitalize] extends null - ? any[] - : never - ) => any - : never + [K in string & keyof T as `on${Capitalize}`]?: ( + ...args: T[K] extends (...args: infer P) => any + ? P + : T[K] extends null + ? any[] + : never + ) => any } : {}