diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index b98f8c34e84..390c6350b8c 100644 --- a/packages/runtime-core/src/componentEmits.ts +++ b/packages/runtime-core/src/componentEmits.ts @@ -44,7 +44,11 @@ export type EmitsToProps = T extends string[] `on${Capitalize}`]?: K extends `on${infer C}` ? T[Uncapitalize] extends null ? (...args: any[]) => any - : T[Uncapitalize] + : ( + ...args: T[Uncapitalize] extends (...args: infer P) => any + ? P + : never + ) => any : never } : {} diff --git a/test-dts/defineComponent.test-d.tsx b/test-dts/defineComponent.test-d.tsx index b28bbed6b4a..9569b585f50 100644 --- a/test-dts/defineComponent.test-d.tsx +++ b/test-dts/defineComponent.test-d.tsx @@ -966,6 +966,33 @@ describe('emits', () => { } }) + // with tsx + const Component = defineComponent({ + emits: { + click: (n: number) => typeof n === 'number' + }, + setup(props, { emit }) { + expectType<((n: number) => any) | undefined>(props.onClick) + emit('click', 1) + // @ts-expect-error + expectError(emit('click')) + // @ts-expect-error + expectError(emit('click', 'foo')) + } + }) + + defineComponent({ + render() { + return ( + { + return n + 1 + }} + /> + ) + } + }) + // without emits defineComponent({ setup(props, { emit }) {