import { Suspense, SuspenseProps } from './components/Suspense'
import { isObject, isArray } from '@vue/shared'
import { RawSlots } from './componentSlots'
-import { FunctionalComponent } from './component'
-import {
- ComponentOptionsWithoutProps,
- ComponentOptionsWithArrayProps,
- ComponentOptionsWithObjectProps,
- ComponentOptions
-} from './componentOptions'
-import { ExtractPropTypes } from './componentProps'
+import { FunctionalComponent, Component } from './component'
+import { ComponentOptions } from './componentOptions'
// `h` is a more user-friendly version of `createVNode` that allows omitting the
// props when possible. It is intended for manually written render functions.
): VNode
// functional component
-export function h(type: FunctionalComponent, children?: RawChildren): VNode
export function h<P>(
type: FunctionalComponent<P>,
props?: (RawProps & P) | ({} extends P ? null : never),
children?: RawChildren | RawSlots
): VNode
-// stateful component
-export function h(type: ComponentOptions, children?: RawChildren): VNode
+// catch-all for generic component types
+export function h(type: Component, children?: RawChildren): VNode
export function h(
- type: ComponentOptionsWithoutProps | ComponentOptionsWithArrayProps,
+ type: ComponentOptions | FunctionalComponent<{}>,
props?: RawProps | null,
children?: RawChildren | RawSlots
): VNode
-export function h<O>(
- type: ComponentOptionsWithObjectProps<O>,
- props?:
- | (RawProps & ExtractPropTypes<O>)
- | ({} extends ExtractPropTypes<O> ? null : never),
- children?: RawChildren | RawSlots
-): VNode
// fake constructor type returned by `defineComponent` or class component
export function h(type: Constructor, children?: RawChildren): VNode
ref,
Fragment,
Teleport,
- Suspense
+ Suspense,
+ Component
} from './index'
describe('h inference w/ element', () => {
expectError(h(Func, { bar: 123 }))
})
-describe('h inference w/ plain object component', () => {
+describe('h support w/ plain object component', () => {
const Foo = {
props: {
foo: String
}
}
-
h(Foo, { foo: 'ok' })
h(Foo, { foo: 'ok', class: 'extra' })
- // should fail on wrong type
- expectError(h(Foo, { foo: 1 }))
+ // no inference in this case
})
describe('h inference w/ defineComponent', () => {
// should fail on wrong type
expectError(h(Foo, { bar: 1, foo: 1 }))
})
+
+// #922
+describe('h support for generic component type', () => {
+ function foo(bar: Component) {
+ h(bar)
+ h(bar, 'hello')
+ h(bar, { id: 'ok' }, 'hello')
+ }
+ foo({})
+})