import { ComponentPublicInstance } from './componentProxy'
import { ExtractPropTypes } from './componentProps'
import { isFunction } from '@vue/shared'
+import { Ref } from '@vue/reactivity'
+
+interface BaseProps {
+ [key: string]: any
+ key?: string | number
+ ref?: string | Ref | Function
+}
// overload 1: direct setup function
// (uses user defined props interface)
+// __isConstructor: true is a type-only differentiator to avoid returned
+// constructor type from being matched as an options object in h()
export function createComponent<Props, RawBindings = object>(
setup: (props: Props, ctx: SetupContext) => RawBindings | RenderFunction
): {
- new (): ComponentPublicInstance<Props, RawBindings>
+ __isConstructor: true
+ new (): ComponentPublicInstance<
+ Props,
+ RawBindings,
+ {},
+ {},
+ {},
+ // public props
+ BaseProps & Props
+ >
}
// overload 2: object format with no props
>(
options: ComponentOptionsWithoutProps<Props, RawBindings, D, C, M>
): {
- new (): ComponentPublicInstance<Props, RawBindings, D, C, M>
+ __isConstructor: true
+ new (): ComponentPublicInstance<
+ Props,
+ RawBindings,
+ D,
+ C,
+ M,
+ BaseProps & Props
+ >
}
// overload 3: object format with array props declaration
-// props inferred as { [key in PropNames]?: unknown }
+// props inferred as { [key in PropNames]?: any }
// return type is for Vetur and TSX support
export function createComponent<
PropNames extends string,
>(
options: ComponentOptionsWithArrayProps<PropNames, RawBindings, D, C, M>
): {
- new (): ComponentPublicInstance<
- { [key in PropNames]?: unknown },
- RawBindings,
- D,
- C,
- M
- >
+ __isConstructor: true
+ // array props technically doesn't place any contraints on props in TSX
+ new (): ComponentPublicInstance<BaseProps, RawBindings, D, C, M>
}
// overload 4: object format with object props declaration
>(
options: ComponentOptionsWithObjectProps<PropsOptions, RawBindings, D, C, M>
): {
+ __isConstructor: true
// for Vetur and TSX support
new (): ComponentPublicInstance<
- ExtractPropTypes<PropsOptions>,
+ ExtractPropTypes<PropsOptions, false>,
RawBindings,
D,
C,
M,
- ExtractPropTypes<PropsOptions, false>
+ BaseProps & ExtractPropTypes<PropsOptions, false>
>
}