refactor(types): widen Component type to include consutructor types
returned from `defineComponent` ref: https://github.com/vuejs/vue-router-next/pull/421 also close #1880 Previous `Component` type is now exported as `ConcreteComponent`. This introduces a minor breaking change when calling `h(comp, { ... })` will now fail if `comp` is a of generic `Component` type, since it does not specify what props it expects.
This commit is contained in:
@@ -1,21 +1,19 @@
|
||||
import {
|
||||
PublicAPIComponent,
|
||||
Component,
|
||||
ConcreteComponent,
|
||||
currentInstance,
|
||||
ComponentInternalInstance,
|
||||
isInSSRComponentSetup
|
||||
} from './component'
|
||||
import { isFunction, isObject } from '@vue/shared'
|
||||
import { ComponentPublicInstance } from './componentProxy'
|
||||
import { ComponentPublicInstance } from './componentPublicInstance'
|
||||
import { createVNode } from './vnode'
|
||||
import { defineComponent } from './apiDefineComponent'
|
||||
import { warn } from './warning'
|
||||
import { ref } from '@vue/reactivity'
|
||||
import { handleError, ErrorCodes } from './errorHandling'
|
||||
|
||||
export type AsyncComponentResolveResult<T = PublicAPIComponent> =
|
||||
| T
|
||||
| { default: T } // es modules
|
||||
export type AsyncComponentResolveResult<T = Component> = T | { default: T } // es modules
|
||||
|
||||
export type AsyncComponentLoader<T = any> = () => Promise<
|
||||
AsyncComponentResolveResult<T>
|
||||
@@ -23,8 +21,8 @@ export type AsyncComponentLoader<T = any> = () => Promise<
|
||||
|
||||
export interface AsyncComponentOptions<T = any> {
|
||||
loader: AsyncComponentLoader<T>
|
||||
loadingComponent?: PublicAPIComponent
|
||||
errorComponent?: PublicAPIComponent
|
||||
loadingComponent?: Component
|
||||
errorComponent?: Component
|
||||
delay?: number
|
||||
timeout?: number
|
||||
suspensible?: boolean
|
||||
@@ -37,7 +35,7 @@ export interface AsyncComponentOptions<T = any> {
|
||||
}
|
||||
|
||||
export function defineAsyncComponent<
|
||||
T extends PublicAPIComponent = { new (): ComponentPublicInstance }
|
||||
T extends Component = { new (): ComponentPublicInstance }
|
||||
>(source: AsyncComponentLoader<T> | AsyncComponentOptions<T>): T {
|
||||
if (isFunction(source)) {
|
||||
source = { loader: source }
|
||||
@@ -53,8 +51,8 @@ export function defineAsyncComponent<
|
||||
onError: userOnError
|
||||
} = source
|
||||
|
||||
let pendingRequest: Promise<Component> | null = null
|
||||
let resolvedComp: Component | undefined
|
||||
let pendingRequest: Promise<ConcreteComponent> | null = null
|
||||
let resolvedComp: ConcreteComponent | undefined
|
||||
|
||||
let retries = 0
|
||||
const retry = () => {
|
||||
@@ -63,8 +61,8 @@ export function defineAsyncComponent<
|
||||
return load()
|
||||
}
|
||||
|
||||
const load = (): Promise<Component> => {
|
||||
let thisRequest: Promise<Component>
|
||||
const load = (): Promise<ConcreteComponent> => {
|
||||
let thisRequest: Promise<ConcreteComponent>
|
||||
return (
|
||||
pendingRequest ||
|
||||
(thisRequest = pendingRequest = loader()
|
||||
@@ -135,7 +133,9 @@ export function defineAsyncComponent<
|
||||
onError(err)
|
||||
return () =>
|
||||
errorComponent
|
||||
? createVNode(errorComponent as Component, { error: err })
|
||||
? createVNode(errorComponent as ConcreteComponent, {
|
||||
error: err
|
||||
})
|
||||
: null
|
||||
})
|
||||
}
|
||||
@@ -175,11 +175,11 @@ export function defineAsyncComponent<
|
||||
if (loaded.value && resolvedComp) {
|
||||
return createInnerComp(resolvedComp, instance)
|
||||
} else if (error.value && errorComponent) {
|
||||
return createVNode(errorComponent as Component, {
|
||||
return createVNode(errorComponent as ConcreteComponent, {
|
||||
error: error.value
|
||||
})
|
||||
} else if (loadingComponent && !delayed.value) {
|
||||
return createVNode(loadingComponent as Component)
|
||||
return createVNode(loadingComponent as ConcreteComponent)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -187,7 +187,7 @@ export function defineAsyncComponent<
|
||||
}
|
||||
|
||||
function createInnerComp(
|
||||
comp: Component,
|
||||
comp: ConcreteComponent,
|
||||
{ vnode: { props, children } }: ComponentInternalInstance
|
||||
) {
|
||||
return createVNode(comp, props, children)
|
||||
|
||||
Reference in New Issue
Block a user