Browse Source

fix(types): fix functional component for `h` (#9991)

- stricter children/slots type
- fix emits/`EE` type argument of `FunctionalComponent`
pull/10060/head
三咲智子 Kevin Deng 2 years ago
committed by GitHub
parent
commit
438a74aad8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      packages/dts-test/h.test-d.ts
  2. 8
      packages/runtime-core/src/h.ts

24
packages/dts-test/h.test-d.ts

@ -2,8 +2,10 @@ import {
type Component,
type DefineComponent,
Fragment,
type FunctionalComponent,
Suspense,
Teleport,
type VNode,
defineComponent,
h,
ref,
@ -77,6 +79,19 @@ describe('h inference w/ Suspense', () => {
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' })
@ -87,6 +102,15 @@ describe('h inference w/ functional component', () => {
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', () => {

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

@ -10,7 +10,7 @@ import {
} 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,
@ -140,11 +140,11 @@ export function h(
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

Loading…
Cancel
Save