type Component,
type DefineComponent,
Fragment,
+ type FunctionalComponent,
Suspense,
Teleport,
+ type VNode,
defineComponent,
h,
ref,
h(Suspense, { onResolve: 1 })
})
+declare const fc: FunctionalComponent<
+ {
+ foo: string
+ bar?: number
+ onClick: (evt: MouseEvent) => void
+ },
+ ['click'],
+ {
+ default: () => VNode
+ title: (scope: { id: number }) => VNode
+ }
+>
+declare const vnode: VNode
describe('h inference w/ functional component', () => {
const Func = (_props: { foo: string; bar?: number }) => ''
h(Func, { foo: 'hello' })
h(Func, {})
// @ts-expect-error
h(Func, { bar: 123 })
+
+ h(
+ fc,
+ { foo: 'hello', onClick: () => {} },
+ {
+ default: () => vnode,
+ title: ({ id }: { id: number }) => vnode,
+ },
+ )
})
describe('h support w/ plain object component', () => {
} from './vnode'
import type { Teleport, TeleportProps } from './components/Teleport'
import type { Suspense, SuspenseProps } from './components/Suspense'
-import { isArray, isObject } from '@vue/shared'
+import { type IfAny, isArray, isObject } from '@vue/shared'
import type { RawSlots } from './componentSlots'
import type {
Component,
export function h<
P,
E extends EmitsOptions = {},
- S extends Record<string, any> = {},
+ S extends Record<string, any> = any,
>(
- type: FunctionalComponent<P, E, S>,
+ type: FunctionalComponent<P, any, S, any>,
props?: (RawProps & P) | ({} extends P ? null : never),
- children?: RawChildren | RawSlots,
+ children?: RawChildren | IfAny<S, RawSlots, S>,
): VNode
// catch-all for generic component types