]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(types): fix tsx emit-mapped handler return type (#4290)
authorwebfansplz <308241863@qq.com>
Wed, 11 Aug 2021 14:52:36 +0000 (22:52 +0800)
committerGitHub <noreply@github.com>
Wed, 11 Aug 2021 14:52:36 +0000 (10:52 -0400)
fix #4288

packages/runtime-core/src/componentEmits.ts
test-dts/defineComponent.test-d.tsx

index b98f8c34e847ab69572dee6773f7318f1c2005e0..390c6350b8ce8c2d2bba97ea7c851a9f7fe43277 100644 (file)
@@ -44,7 +44,11 @@ export type EmitsToProps<T extends EmitsOptions> = T extends string[]
         `on${Capitalize<string & keyof T>}`]?: K extends `on${infer C}`
         ? T[Uncapitalize<C>] extends null
           ? (...args: any[]) => any
-          : T[Uncapitalize<C>]
+          : (
+              ...args: T[Uncapitalize<C>] extends (...args: infer P) => any
+                ? P
+                : never
+            ) => any
         : never
     }
   : {}
index b28bbed6b4a951de24a34231bdb89522c12cc8c5..9569b585f501e49fcbd8103418595696018d965d 100644 (file)
@@ -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 (
+        <Component
+          onClick={(n: number) => {
+            return n + 1
+          }}
+        />
+      )
+    }
+  })
+
   // without emits
   defineComponent({
     setup(props, { emit }) {