Browse Source

fix(types): improve `h` overload to support union of string and component (#5432)

fix #5431
Carlos Rodrigues 2 years ago
parent
commit
16ecb44c89
2 changed files with 24 additions and 0 deletions
  1. 16 0
      packages/dts-test/h.test-d.ts
  2. 8 0
      packages/runtime-core/src/h.ts

+ 16 - 0
packages/dts-test/h.test-d.ts

@@ -1,6 +1,7 @@
 import {
   h,
   defineComponent,
+  DefineComponent,
   ref,
   Fragment,
   Teleport,
@@ -231,3 +232,18 @@ describe('resolveComponent should work', () => {
     message: '1'
   })
 })
+
+// #5431
+describe('h should work with multiple types', () => {
+  const serializers = {
+    Paragraph: 'p',
+    Component: {} as Component,
+    DefineComponent: {} as DefineComponent
+  }
+
+  const sampleComponent = serializers['' as keyof typeof serializers]
+
+  h(sampleComponent)
+  h(sampleComponent, {})
+  h(sampleComponent, {}, [])
+})

+ 8 - 0
packages/runtime-core/src/h.ts

@@ -174,6 +174,14 @@ export function h<P>(
   children?: RawChildren | RawSlots
 ): VNode
 
+// catch all types
+export function h(type: string | Component, children?: RawChildren): VNode
+export function h<P>(
+  type: string | Component<P>,
+  props?: (RawProps & P) | ({} extends P ? null : never),
+  children?: RawChildren | RawSlots
+): VNode
+
 // Actual implementation
 export function h(type: any, propsOrChildren?: any, children?: any): VNode {
   const l = arguments.length