Skip to content

Commit 1ce34e2

Browse files
authored
fix(types): fix tsx emit-mapped handler return type (#4290)
fix #4288
1 parent 380608b commit 1ce34e2

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

packages/runtime-core/src/componentEmits.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ export type EmitsToProps<T extends EmitsOptions> = T extends string[]
4444
`on${Capitalize<string & keyof T>}`]?: K extends `on${infer C}`
4545
? T[Uncapitalize<C>] extends null
4646
? (...args: any[]) => any
47-
: T[Uncapitalize<C>]
47+
: (
48+
...args: T[Uncapitalize<C>] extends (...args: infer P) => any
49+
? P
50+
: never
51+
) => any
4852
: never
4953
}
5054
: {}

test-dts/defineComponent.test-d.tsx

+27
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,33 @@ describe('emits', () => {
966966
}
967967
})
968968

969+
// with tsx
970+
const Component = defineComponent({
971+
emits: {
972+
click: (n: number) => typeof n === 'number'
973+
},
974+
setup(props, { emit }) {
975+
expectType<((n: number) => any) | undefined>(props.onClick)
976+
emit('click', 1)
977+
// @ts-expect-error
978+
expectError(emit('click'))
979+
// @ts-expect-error
980+
expectError(emit('click', 'foo'))
981+
}
982+
})
983+
984+
defineComponent({
985+
render() {
986+
return (
987+
<Component
988+
onClick={(n: number) => {
989+
return n + 1
990+
}}
991+
/>
992+
)
993+
}
994+
})
995+
969996
// without emits
970997
defineComponent({
971998
setup(props, { emit }) {

0 commit comments

Comments
 (0)