import { InjectionKey, Prop, SetupContext, VNodeChild } from 'vue';
import { StaticProvider } from 'static-injector/import/typings/di/interface/provider';
export interface VueComponentStaticContructor {
    ɵfac?: (...args: any[]) => any;
    ɵprov?: StaticProvider;
    new (...args: any[]): any;
    /** 组件显示名称 */
    displayName?: string;
    /** 组件属性vue描述 */
    defaultProps?: any;
    /** 组件是否回退attrs */
    inheritAttrs?: boolean;
    /** 组件使用的指令 */
    directives?: any;
    /** 组件作为服务的key */
    ProviderKey?: symbol | string | number | InjectionKey<any>;
    /** 组件是否作为全局服务 */
    globalStore?: boolean;
    /** 自定义解析组件 */
    resolveComponent?: any;
    providers?: StaticProvider[];
    asStore?: boolean;
    [prop: string]: any;
}
/**
 * 装饰器处理
 */
export interface Hanlder {
    key: string;
    handler: (targetThis: any) => void;
}
declare type DefaultSlots = {
    default(): VNodeChild;
};
declare type MixDefaultSlots<T extends {}> = 'default' extends keyof T ? {} : DefaultSlots;
export declare type WithVSlots<T extends {}> = {
    'v-slots'?: 'slots' extends keyof T ? Partial<T['slots'] & {
        $stable: boolean;
    } & MixDefaultSlots<T['slots']>> : Partial<{
        $stable: boolean;
        default(): VNodeChild;
    }>;
};
export declare type WithSlotTypes<T extends {}> = Omit<SetupContext, 'slots'> & {
    slots: 'slots' extends keyof T ? Partial<T['slots'] & MixDefaultSlots<T['slots']>> : Partial<{
        default(): VNodeChild;
    }>;
};
declare type ModelProps<T extends {}> = Exclude<{
    [Prop in keyof T]: T extends {
        [k in Prop as `onUpdate:${k & string}`]?: any;
    } ? Prop : never;
}[keyof T], undefined>;
export declare type WithVModel<T extends {}, U extends keyof T = ModelProps<T>> = TransformModelValue<{
    [k in U as `v-model:${k & string}`]?: T[k] | [T[k], string[]];
}>;
export declare type TransformModelValue<T extends {}> = 'v-model:modelValue' extends keyof T ? Omit<T, 'v-model:modelValue'> & {
    ['v-model']?: T['v-model:modelValue'];
} : T;
export declare type ComponentProps<T extends {}> = ComponentPropsArray<T> | ComponentPropsObject<T>;
export declare type ComponentPropsObject<T extends {}> = {
    [U in keyof Omit<T, 'slots'>]-?: Prop<any>;
};
export declare type ComponentPropsArray<T extends {}> = UnionToTuple<keyof Omit<T, 'slots'>>;
export declare type ComponentSlots<T extends {
    props: any;
}> = T['props']['v-slots'];
/** 为了阻止ts把不相关的类也解析到metadata数据中，用这个工具类型包装一下类 */
export declare type ClassType<T> = T;
export declare type UnionToTuple<T> = ((T extends any ? (t: T) => T : never) extends infer U ? (U extends any ? (u: U) => any : never) extends (v: infer V) => any ? V : never : never) extends (_: any) => infer W ? [...UnionToTuple<Exclude<T, W>>, W] : [];
export {};
