import { defineComponent as _defineComponent } from 'vue';
import type { ComponentOptionsMixin, ComponentOptionsWithObjectProps, ComponentPropsOptions, ComputedOptions, DefineComponent, EmitsOptions, MethodOptions, VNode, VNodeChild } from 'vue';
export declare function propIsDefined(vnode: VNode, prop: string): boolean | undefined;
export declare const defineComponent: typeof _defineComponent;
type ToListeners<T extends string | number | symbol> = {
    [K in T]: K extends `on${infer U}` ? Uncapitalize<U> : K;
}[T];
type SlotsToProps<T extends Record<string, Slot>> = {
    $children: () => (T['default'] | VNodeChild | {
        [K in keyof T]?: T[K] | VNodeChild;
    });
    'v-slots': new () => {
        [K in keyof T]?: T[K] | false;
    };
};
type Slot<T extends any[] = any[]> = (...args: T) => VNode | VNode[];
export type MakeSlots<T extends Record<string, any[]>> = {
    [K in keyof T]: Slot<T[K]>;
};
export declare function genericComponent<T extends (new () => {
    $slots?: Record<string, Slot>;
})>(exposeDefaults?: boolean): <PropsOptions extends Readonly<ComponentPropsOptions>, RawBindings, D, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record<string, any>, EE extends string = string, I = InstanceType<T>, Base = DefineComponent<(I extends Record<'$props', any> ? Omit<PropsOptions, keyof I['$props']> : PropsOptions) & (I extends Record<'$slots', any> ? SlotsToProps<I['$slots']> : {}), RawBindings, D, C, M, Mixin, Extends, E extends any[] ? E : I extends Record<'$props', any> ? Omit<E, ToListeners<keyof I['$props']>> : E, EE>>(options: ComponentOptionsWithObjectProps<PropsOptions, RawBindings, D, C, M, Mixin, Extends, E, EE>) => Base & T;
export {};
