From 1ce34e25d56e73591acc5bbe6e52ec8ef026cc6c Mon Sep 17 00:00:00 2001 From: webfansplz <308241863@qq.com> Date: Wed, 11 Aug 2021 22:52:36 +0800 Subject: [PATCH] fix(types): fix tsx emit-mapped handler return type (#4290) fix #4288 --- packages/runtime-core/src/componentEmits.ts | 6 ++++- test-dts/defineComponent.test-d.tsx | 27 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index b98f8c34e..390c6350b 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 b28bbed6b..9569b585f 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 }) {