mirror of https://github.com/vuejs/core.git
types(defineComponent): Keep slot information on functional components
This commit is contained in:
parent
dd26e98233
commit
e8f693eda6
|
@ -1497,6 +1497,41 @@ describe('should work when props type is incompatible with setup returned type '
|
||||||
expectType<SizeType>(CompA.$props.size)
|
expectType<SizeType>(CompA.$props.size)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #9649
|
||||||
|
describe('should keep slots on functional component', () => {
|
||||||
|
const Comp = defineComponent(
|
||||||
|
(
|
||||||
|
_1: {},
|
||||||
|
_2: SetupContext<
|
||||||
|
{},
|
||||||
|
SlotsType<{ default?(data: { foo: string; bar: number }): any }>
|
||||||
|
>
|
||||||
|
) =>
|
||||||
|
() =>
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
slots: Object as SlotsType<{ default: { foo: string; bar: number } }>
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
h(Comp, {
|
||||||
|
default: data => {
|
||||||
|
expectType<{ foo: string; bar: number }>(data)
|
||||||
|
// @ts-expect-error not any
|
||||||
|
expectType<string>(data)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
h(Comp, null, {
|
||||||
|
default: data => {
|
||||||
|
expectType<{ foo: string; bar: number }>(data)
|
||||||
|
// @ts-expect-error not any
|
||||||
|
expectType<string>(data)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
import {
|
import {
|
||||||
DefineComponent,
|
DefineComponent,
|
||||||
ComponentOptionsMixin,
|
ComponentOptionsMixin,
|
||||||
|
|
|
@ -111,7 +111,7 @@ export function defineComponent<
|
||||||
emits?: E | EE[]
|
emits?: E | EE[]
|
||||||
slots?: S
|
slots?: S
|
||||||
}
|
}
|
||||||
): (props: Props & EmitsToProps<E>) => any
|
): (props: Props & EmitsToProps<E> & S) => any
|
||||||
export function defineComponent<
|
export function defineComponent<
|
||||||
Props extends Record<string, any>,
|
Props extends Record<string, any>,
|
||||||
E extends EmitsOptions = {},
|
E extends EmitsOptions = {},
|
||||||
|
@ -127,7 +127,7 @@ export function defineComponent<
|
||||||
emits?: E | EE[]
|
emits?: E | EE[]
|
||||||
slots?: S
|
slots?: S
|
||||||
}
|
}
|
||||||
): (props: Props & EmitsToProps<E>) => any
|
): (props: Props & EmitsToProps<E> & S) => any
|
||||||
|
|
||||||
// overload 2: object format with no props
|
// overload 2: object format with no props
|
||||||
// (uses user defined props interface)
|
// (uses user defined props interface)
|
||||||
|
|
|
@ -11,7 +11,7 @@ import {
|
||||||
import { Teleport, TeleportProps } from './components/Teleport'
|
import { Teleport, TeleportProps } from './components/Teleport'
|
||||||
import { Suspense, SuspenseProps } from './components/Suspense'
|
import { Suspense, SuspenseProps } from './components/Suspense'
|
||||||
import { isObject, isArray } from '@vue/shared'
|
import { isObject, isArray } from '@vue/shared'
|
||||||
import { RawSlots } from './componentSlots'
|
import { RawSlots, SlotsType, UnwrapSlotsType } from './componentSlots'
|
||||||
import {
|
import {
|
||||||
FunctionalComponent,
|
FunctionalComponent,
|
||||||
Component,
|
Component,
|
||||||
|
@ -119,6 +119,17 @@ export function h(
|
||||||
children?: RawChildren | RawSlots
|
children?: RawChildren | RawSlots
|
||||||
): VNode
|
): VNode
|
||||||
|
|
||||||
|
// functional component
|
||||||
|
export function h<
|
||||||
|
P,
|
||||||
|
E extends EmitsOptions = {},
|
||||||
|
S extends Record<string, any> = {}
|
||||||
|
>(
|
||||||
|
type: FunctionalComponent<P, E, S>,
|
||||||
|
children?:
|
||||||
|
| RawChildren
|
||||||
|
| (P extends SlotsType<any> ? UnwrapSlotsType<P> : never)
|
||||||
|
): VNode
|
||||||
// functional component
|
// functional component
|
||||||
export function h<
|
export function h<
|
||||||
P,
|
P,
|
||||||
|
@ -127,7 +138,10 @@ export function h<
|
||||||
>(
|
>(
|
||||||
type: FunctionalComponent<P, E, S>,
|
type: FunctionalComponent<P, E, S>,
|
||||||
props?: (RawProps & P) | ({} extends P ? null : never),
|
props?: (RawProps & P) | ({} extends P ? null : never),
|
||||||
children?: RawChildren | RawSlots
|
children?:
|
||||||
|
| RawChildren
|
||||||
|
| RawSlots
|
||||||
|
| (P extends SlotsType<any> ? UnwrapSlotsType<P> : {})
|
||||||
): VNode
|
): VNode
|
||||||
|
|
||||||
// catch-all for generic component types
|
// catch-all for generic component types
|
||||||
|
|
Loading…
Reference in New Issue