diff --git a/packages-private/dts-test/setupHelpers.test-d.ts b/packages-private/dts-test/setupHelpers.test-d.ts index 656f1da79f2..a9fb72a6e97 100644 --- a/packages-private/dts-test/setupHelpers.test-d.ts +++ b/packages-private/dts-test/setupHelpers.test-d.ts @@ -632,3 +632,22 @@ describe('defineOptions', () => { expose: ['expose'], }) }) + +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 `