import { Suspense, SuspenseProps } from './components/Suspense'
import { isObject, isArray } from '@vue/shared'
import { RawSlots } from './componentSlots'
-import { FunctionalComponent, Component, ComponentOptions } from './component'
+import {
+ FunctionalComponent,
+ Component,
+ ComponentOptions,
+ ConcreteComponent
+} from './component'
import { EmitsOptions } from './componentEmits'
import { DefineComponent } from './apiDefineComponent'
// catch-all for generic component types
export function h(type: Component, children?: RawChildren): VNode
+// concrete component
+export function h<P>(
+ type: ConcreteComponent | string,
+ children?: RawChildren
+): VNode
+export function h<P>(
+ type: ConcreteComponent<P> | string,
+ props?: (RawProps & P) | ({} extends P ? null : never),
+ children?: RawChildren
+): VNode
+
// component without props
export function h(
type: Component,
/**
* @private
*/
-export function resolveComponent(
- name: string
-): ConcreteComponent | string | undefined {
+export function resolveComponent(name: string): ConcreteComponent | string {
return resolveAsset(COMPONENTS, name) || name
}
Suspense,
Component,
expectError,
- expectAssignable
+ expectAssignable,
+ resolveComponent
} from './index'
describe('h inference w/ element', () => {
// @ts-expect-error
expectError(h(RequiredComponent, {}))
})
+
+// #2357
+describe('resolveComponent should work', () => {
+ h(resolveComponent('test'))
+ h(resolveComponent('test'), {
+ message: '1'
+ })
+})