import ElementType from './annotation/ElementType';
import { IAnnotationClazz, LinkAnnotationType } from './annotation/type';
type ValuePropertyType<A> = A extends {
    value?: infer V;
} ? unknown extends V ? never : V : never;
type TargetObject = {
    [x: string]: any;
};
type ExcludeKeys<T, E> = {
    [P in keyof T]: P extends E ? T[P] | E : '';
}[keyof T];
type IsOptionKey<X, Y, A, B, C, ExcludeKeys> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? A extends ExcludeKeys ? C : A : C;
type GetOptionKeys<T, ExcludeKeys> = {
    [P in keyof T]: IsOptionKey<{
        [Q in P]: T[P];
    }, {
        -readonly [Q in P]: T[P];
    }, P, T[P], never, ExcludeKeys>;
}[keyof T];
export type CreateOptions<T extends abstract new (...args: any[]) => any> = Pick<InstanceType<T>, GetOptionKeys<InstanceType<T>, ExcludeKeys<InstanceType<T>, '__exclude_keys__'>>>;
declare function ClassTargetDecorator<A>(target: Function): any;
declare function ClassTargetDecorator<A>(options: A): ClassDecorator;
declare type ConfigableClassDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function MethodTargetDecorator<A>(options: A): MethodDecorator;
declare function MethodTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare type ConfigableMethodDecorator = <A extends IAnnotationClazz>(target: A) => typeof MethodTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function PropertyTargetDecorator<A>(options: A): (target: Object, propertyKey: string) => any;
declare function PropertyTargetDecorator<A>(target: TargetObject, propertyKey: string): any;
declare type ConfigablePropertyDecorator = <A extends IAnnotationClazz>(target: A) => typeof PropertyTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ParameterTargetDecorator<A>(options: A): ParameterDecorator;
declare function ParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigableParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof ParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ClassMethodTargetDecoratorReturn(target: Function): any;
declare function ClassMethodTargetDecoratorReturn(target: Object, name: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function ClassMethodTargetDecorator<A>(target: Function): any;
declare function ClassMethodTargetDecorator<A>(options: A): typeof ClassMethodTargetDecoratorReturn;
declare function ClassMethodTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare type ConfigableClassMethodDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassMethodTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ClassMethodPropertyTargetDecorator<A>(options: A): (target: any, name?: string) => any;
declare function ClassMethodPropertyTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function ClassMethodPropertyTargetDecorator<A>(target: TargetObject, propertyKey: string): any;
declare function ClassMethodPropertyTargetDecorator<A>(target: Function): any;
declare type ConfigableClassMethodPropertyDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassMethodPropertyTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ClassMethodParameterTargetDecoratorReturn(target: Function): any;
declare function ClassMethodParameterTargetDecoratorReturn(target: Object, name: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function ClassMethodParameterTargetDecoratorReturn(target: Object, name: string, parameterIndex: number): any;
declare function ClassMethodParameterTargetDecorator<A>(options: A): typeof ClassMethodParameterTargetDecoratorReturn;
declare function ClassMethodParameterTargetDecorator<A>(target: Function): any;
declare function ClassMethodParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function ClassMethodParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigableClassMethodParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassMethodParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ClassPropertyTargetDecorator<A>(options: A): (target: Function | Object, name?: string, p?: void) => any;
declare function ClassPropertyTargetDecorator<A>(target: Function): any;
declare function ClassPropertyTargetDecorator<A>(target: TargetObject, propertyKey: string, p?: void): void;
declare type ConfigableClassPropertyDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassPropertyTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ClassPropertyParameterTargetDecorator<A>(options: A): (target: Function | Object, name?: string, p?: number) => any;
declare function ClassPropertyParameterTargetDecorator<A>(target: Function): any;
declare function ClassPropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, p?: void): void;
declare function ClassPropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigableClassPropertyParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassPropertyParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function ClassParameterTargetDecoratorReturn(target: Function): any;
declare function ClassParameterTargetDecoratorReturn(target: Object, propertyKey: string, parameterIndex: number): void;
declare function ClassParameterTargetDecorator<A>(options: A): typeof ClassParameterTargetDecoratorReturn;
declare function ClassParameterTargetDecorator<A>(target: Function): any;
declare function ClassParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): void;
declare type ConfigableClassParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof ClassParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function AllTargetDecorator<A>(options: A): (target: any, name?: string, p?: number | TypedPropertyDescriptor<any>) => any;
declare function AllTargetDecorator<A>(target: Function): any;
declare function AllTargetDecorator<A>(target: TargetObject, propertyKey: string): any;
declare function AllTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function AllTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigableAllDecorator = <A extends IAnnotationClazz>(target: A) => typeof AllTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function MethodPropertyTargetDecorator<A>(options: A): (target: Object, name: string, p?: TypedPropertyDescriptor<any>) => any;
declare function MethodPropertyTargetDecorator<A>(target: TargetObject, propertyKey: string): any;
declare function MethodPropertyTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare type ConfigableMethodPropertyDecorator = <A extends IAnnotationClazz>(target: A) => typeof MethodPropertyTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function MethodPropertyParameterTargetDecorator<A>(options: A): (target: Object, name: string, p?: number | TypedPropertyDescriptor<any>) => any;
declare function MethodPropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string): any;
declare function MethodPropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function MethodPropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigableMethodPropertyParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof MethodPropertyParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function MethodParameterTargetDecorator<A>(options: A): (target: Object, name: string, p: TypedPropertyDescriptor<any> | number) => any;
declare function MethodParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): any;
declare function MethodParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigableMethodParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof MethodParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
declare function PropertyParameterTargetDecorator<A>(options: A): (target: Object, name: string, p?: number) => any;
declare function PropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string): any;
declare function PropertyParameterTargetDecorator<A>(target: TargetObject, propertyKey: string, parameterIndex: number): any;
declare type ConfigablePropertyParameterDecorator = <A extends IAnnotationClazz>(target: A) => typeof PropertyParameterTargetDecorator<CreateOptions<A> | ValuePropertyType<InstanceType<A>>> & LinkAnnotationType<A> & A;
type PushFront<TailT extends any[], HeadT> = ((head: HeadT, ...tail: TailT) => void) extends ((...arr: infer ArrT) => void) ? ArrT : never;
type UnorderTuple<U extends string, ResultT extends any[] = []> = {
    [k in U]: ([
        Exclude<U, k>
    ] extends [never] ? PushFront<ResultT, k> : UnorderTuple<Exclude<U, k>, PushFront<ResultT, k>>);
}[U];
declare function Target<E = never>(elementType: ElementType.TYPE | [ElementType.TYPE]): ConfigableClassDecorator;
declare function Target<E = never>(elementType: ElementType.METHOD | [ElementType.METHOD]): ConfigableMethodDecorator;
declare function Target<E = never>(elementType: ElementType.PARAMETER | [ElementType.PARAMETER]): ConfigableParameterDecorator;
declare function Target<E = never>(elementType: ElementType.PROPERTY | [ElementType.PROPERTY]): ConfigablePropertyDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.METHOD>): ConfigableClassMethodDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.METHOD | ElementType.PARAMETER>): ConfigableClassMethodParameterDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.METHOD | ElementType.PROPERTY>): ConfigableClassMethodPropertyDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.METHOD | ElementType.PROPERTY | ElementType.PARAMETER>): ConfigableAllDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.PROPERTY>): ConfigableClassPropertyDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.PROPERTY | ElementType.PARAMETER>): ConfigableClassPropertyParameterDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.TYPE | ElementType.PARAMETER>): ConfigableClassParameterDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.METHOD | ElementType.PROPERTY>): ConfigableMethodPropertyDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.METHOD | ElementType.PROPERTY | ElementType.PARAMETER>): ConfigableMethodPropertyParameterDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.METHOD | ElementType.PARAMETER>): ConfigableMethodParameterDecorator;
declare function Target<E = never>(elementTypes: UnorderTuple<ElementType.PROPERTY | ElementType.PARAMETER>): ConfigablePropertyParameterDecorator;
export default Target;
