From ebc4f0f1987298ef20ed4a97f62277637717f501 Mon Sep 17 00:00:00 2001 From: xienan <1633875789@qq.com> Date: Sun, 30 Nov 2025 19:23:58 +0800 Subject: [PATCH 1/2] fix(types): enable proper type narrowing for defineEmits (#13935) --- .../dts-test/issue-13935.test-d.ts | 21 +++++++++++++++++++ packages/runtime-core/src/apiSetupHelpers.ts | 12 ++++------- 2 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 packages-private/dts-test/issue-13935.test-d.ts diff --git a/packages-private/dts-test/issue-13935.test-d.ts b/packages-private/dts-test/issue-13935.test-d.ts new file mode 100644 index 00000000000..24a3a778568 --- /dev/null +++ b/packages-private/dts-test/issue-13935.test-d.ts @@ -0,0 +1,21 @@ +import { defineEmits } from 'vue' +import { describe } from './utils' + +describe('defineEmits w/ type declaration (Issue #13935)', () => { + const emit = defineEmits<{ + open: [payload: number] + close: [payload: string] + }>() + + // Correct usages + emit('open', 123) + emit('close', 'abc') + + // Incorrect usages (should fail type check) + // @ts-expect-error + emit('open', 'string') + // @ts-expect-error + emit('close', 123) + // @ts-expect-error + emit('unknown', 123) +}) diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index 67e1d550387..d784098df50 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -2,7 +2,6 @@ import { type IfAny, type LooseRequired, type Prettify, - type UnionToIntersection, extend, isArray, isFunction, @@ -151,13 +150,10 @@ export function defineEmits() { export type ComponentTypeEmits = ((...args: any[]) => any) | Record -type RecordToUnion> = T[keyof T] - -type ShortEmits> = UnionToIntersection< - RecordToUnion<{ - [K in keyof T]: (evt: K, ...args: T[K]) => void - }> -> +type ShortEmits> = ( + evt: K, + ...args: T[K] +) => void /** * Vue `