fix(types): make return type of defineComponent assignable to Component type (#1032)

fix #993
This commit is contained in:
Carlos Rodrigues
2020-04-24 18:22:58 +01:00
committed by GitHub
parent 28b4c317b4
commit f3a9b516bd
4 changed files with 49 additions and 10 deletions

View File

@@ -5,7 +5,7 @@ import {
ComponentOptionsWithArrayProps,
ComponentOptionsWithObjectProps
} from './componentOptions'
import { SetupContext, RenderFunction } from './component'
import { SetupContext, RenderFunction, FunctionalComponent } from './component'
import { ComponentPublicInstance } from './componentProxy'
import { ExtractPropTypes, ComponentPropsOptions } from './componentProps'
import { EmitsOptions } from './componentEmits'
@@ -34,7 +34,7 @@ export function defineComponent<Props, RawBindings = object>(
// public props
VNodeProps & Props
>
}
} & FunctionalComponent<Props>
// overload 2: object format with no props
// (uses user defined props interface)
@@ -59,7 +59,7 @@ export function defineComponent<
E,
VNodeProps & Props
>
}
} & ComponentOptionsWithoutProps<Props, RawBindings, D, C, M, E, EE>
// overload 3: object format with array props declaration
// props inferred as { [key in PropNames]?: any }
@@ -85,7 +85,7 @@ export function defineComponent<
): {
// array props technically doesn't place any contraints on props in TSX
new (): ComponentPublicInstance<VNodeProps, RawBindings, D, C, M, E>
}
} & ComponentOptionsWithArrayProps<PropNames, RawBindings, D, C, M, E, EE>
// overload 4: object format with object props declaration
// see `ExtractPropTypes` in ./componentProps.ts
@@ -119,7 +119,7 @@ export function defineComponent<
E,
VNodeProps & ExtractPropTypes<PropsOptions, false>
>
}
} & ComponentOptionsWithObjectProps<PropsOptions, RawBindings, D, C, M, E, EE>
// implementation, close to no-op
export function defineComponent(options: unknown) {

View File

@@ -67,6 +67,11 @@ interface Constructor<P = any> {
new (): { $props: P }
}
// Excludes Component type from returned `defineComponent`
type NotDefinedComponent<T extends Component> = T extends Constructor
? never
: T
// The following is a series of overloads for providing props validation of
// manually written render functions.
@@ -110,8 +115,10 @@ export function h<P>(
// catch-all for generic component types
export function h(type: Component, children?: RawChildren): VNode
export function h(
type: ComponentOptions | FunctionalComponent<{}>,
// exclude `defineComponent`
export function h<Options extends ComponentOptions | FunctionalComponent<{}>>(
type: NotDefinedComponent<Options>,
props?: RawProps | null,
children?: RawChildren | RawSlots
): VNode