diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index 6418f8c7d5d..daf82b71e30 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -28,8 +28,8 @@ export type EmitsOptions = ObjectEmitsOptions | string[] export type EmitFn< Options = ObjectEmitsOptions, Event extends keyof Options = keyof Options -> = Options extends any[] - ? (event: Options[0], ...args: any[]) => void +> = Options extends Array + ? (event: V, ...args: any[]) => void : {} extends Options // if the emit is empty object (usually the default value for emit) should be converted to function ? (event: string, ...args: any[]) => void : UnionToIntersection< diff --git a/test-dts/functionalComponent.test-d.tsx b/test-dts/functionalComponent.test-d.tsx index c53c4287a6e..4fe4db645af 100644 --- a/test-dts/functionalComponent.test-d.tsx +++ b/test-dts/functionalComponent.test-d.tsx @@ -63,3 +63,12 @@ const Baz: FunctionalComponent<{}, string[]> = (props, { emit }) => { } expectType(Baz) + +const Qux: FunctionalComponent<{}, ['foo', 'bar']> = (props, { emit }) => { + emit('foo') + emit('foo', 1, 2) + emit('bar') + emit('bar', 1, 2) +} + +expectType(Qux)