mirror of https://github.com/vuejs/core.git
fix(types): fix functional component for `h` (#9991)
- stricter children/slots type - fix emits/`EE` type argument of `FunctionalComponent`
This commit is contained in:
parent
2fd3905738
commit
438a74aad8
|
@ -2,8 +2,10 @@ import {
|
||||||
type Component,
|
type Component,
|
||||||
type DefineComponent,
|
type DefineComponent,
|
||||||
Fragment,
|
Fragment,
|
||||||
|
type FunctionalComponent,
|
||||||
Suspense,
|
Suspense,
|
||||||
Teleport,
|
Teleport,
|
||||||
|
type VNode,
|
||||||
defineComponent,
|
defineComponent,
|
||||||
h,
|
h,
|
||||||
ref,
|
ref,
|
||||||
|
@ -77,6 +79,19 @@ describe('h inference w/ Suspense', () => {
|
||||||
h(Suspense, { onResolve: 1 })
|
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', () => {
|
describe('h inference w/ functional component', () => {
|
||||||
const Func = (_props: { foo: string; bar?: number }) => ''
|
const Func = (_props: { foo: string; bar?: number }) => ''
|
||||||
h(Func, { foo: 'hello' })
|
h(Func, { foo: 'hello' })
|
||||||
|
@ -87,6 +102,15 @@ describe('h inference w/ functional component', () => {
|
||||||
h(Func, {})
|
h(Func, {})
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
h(Func, { bar: 123 })
|
h(Func, { bar: 123 })
|
||||||
|
|
||||||
|
h(
|
||||||
|
fc,
|
||||||
|
{ foo: 'hello', onClick: () => {} },
|
||||||
|
{
|
||||||
|
default: () => vnode,
|
||||||
|
title: ({ id }: { id: number }) => vnode,
|
||||||
|
},
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('h support w/ plain object component', () => {
|
describe('h support w/ plain object component', () => {
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {
|
||||||
} from './vnode'
|
} from './vnode'
|
||||||
import type { Teleport, TeleportProps } from './components/Teleport'
|
import type { Teleport, TeleportProps } from './components/Teleport'
|
||||||
import type { Suspense, SuspenseProps } from './components/Suspense'
|
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 { RawSlots } from './componentSlots'
|
||||||
import type {
|
import type {
|
||||||
Component,
|
Component,
|
||||||
|
@ -140,11 +140,11 @@ export function h(
|
||||||
export function h<
|
export function h<
|
||||||
P,
|
P,
|
||||||
E extends EmitsOptions = {},
|
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),
|
props?: (RawProps & P) | ({} extends P ? null : never),
|
||||||
children?: RawChildren | RawSlots,
|
children?: RawChildren | IfAny<S, RawSlots, S>,
|
||||||
): VNode
|
): VNode
|
||||||
|
|
||||||
// catch-all for generic component types
|
// catch-all for generic component types
|
||||||
|
|
Loading…
Reference in New Issue