From: webfansplz <308241863@qq.com> Date: Wed, 11 Aug 2021 14:52:36 +0000 (+0800) Subject: fix(types): fix tsx emit-mapped handler return type (#4290) X-Git-Tag: v3.2.2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ce34e25d56e73591acc5bbe6e52ec8ef026cc6c;p=thirdparty%2Fvuejs%2Fcore.git fix(types): fix tsx emit-mapped handler return type (#4290) fix #4288 --- diff --git a/packages/runtime-core/src/componentEmits.ts b/packages/runtime-core/src/componentEmits.ts index b98f8c34e8..390c6350b8 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 b28bbed6b4..9569b585f5 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 }) {