import { Alias } from './alias';
import { CustomKey } from './custom-key';
import { CustomOption } from './custom-option';
import { CustomValue } from './custom-value';
import { DefaultValue } from './default-value';
import { GenericArgument } from './generic-argument';
import { GenericMetadata } from './generic-metadata';
import { Metadata } from './metadata';
import { NamingConvention } from './naming-convention';
import { Nullable } from './nullable';
import { Optional } from './optional';
import { PropertyExtensionMetadata } from './property-extension-metadata';
import { PropertyExtensionMetadataCtor } from './property-extension-metadata-ctor';
import { PropertyExtensionOptions } from './property-extension-options';
import { PropertyName } from './property-name';
import { PropertyOptions } from './property-options';
import { PropertyState } from './property-state';
import { ResolvedPropertyState } from './property-states/resolved-property-state';
import { UnresolvedPropertyState } from './property-states/unresolved-property-state';
import { ReferenceHandler } from './reference-handler';
import { Serializer } from './serializer';
import { TypeArgument } from './type-argument';
import { TypeFn } from './type-fn';
import { TypeManager } from './type-manager';
import { TypeMetadata } from './type-metadata';
/**
 * Main class used to describe a certain property.
 *
 * @type {PropertyMetadata<TDeclaringObject, TObject>}
 */
export declare class PropertyMetadata<TDeclaringObject, TObject> extends Metadata {
    /**
     * Type metadata to which property metadata belongs to.
     *
     * @type {TypeMetadata<TDeclaringObject>}
     */
    readonly declaringTypeMetadata: TypeMetadata<TDeclaringObject>;
    /**
     * Property name as declared in type.
     *
     * @type {PropertyName}
     */
    readonly propertyName: PropertyName;
    /**
     * Normalized property name used for sorting.
     *
     * @type {PropertyName}
     */
    readonly normalizedPropertyName: PropertyName;
    /**
     * Property options.
     *
     * @type {PropertyOptions<TObject>}
     */
    private readonly propertyOptions;
    /**
     * Type function defined using reflect metadata.
     *
     * @type {Optional<TypeFn<TObject>>}
     */
    private readonly reflectTypeFn;
    /**
     * Current property state.
     *
     * @type {PropertyState<TDeclaringObject, TObject>}
     */
    private currentPropertyState;
    /**
     * Constructor.
     *
     * @param {TypeManager} typeManager Type manager.
     * @param {ReadonlyMap<Alias, TypeFn<any>>} typeFnMap Type function map for types with aliases.
     * @param {TypeMetadata<TDeclaringObject>} declaringTypeMetadata Type metadata to which property metadata belongs to.
     * @param {PropertyName} propertyName Property name.
     * @param {PropertyOptions<TObject>} propertyOptions Property options.
     */
    constructor(typeManager: TypeManager, typeFnMap: ReadonlyMap<Alias, TypeFn<any>>, declaringTypeMetadata: TypeMetadata<TDeclaringObject>, propertyName: PropertyName, propertyOptions: PropertyOptions<TObject>);
    /**
     * Gets property state.
     *
     * @returns {PropertyState<TDeclaringObject, TObject>} Property state.
     */
    get propertyState(): PropertyState<TDeclaringObject, TObject>;
    /**
     * Gets alias.
     *
     * @returns {Optional<Alias>} Alias or undefined.
     */
    get alias(): Optional<Alias>;
    /**
     * Gets custom value map.
     *
     * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Custom value map.
     */
    get customValueMap(): ReadonlyMap<CustomKey<any>, CustomValue>;
    /**
     * Gets serialized null value.
     *
     * @returns {Nullable<any>} Resolved serialized null value or undefined.
     */
    get serializedNullValue(): Nullable<any>;
    /**
     * Gets serialized default value.
     *
     * @returns {Optional<any>} Resolved serialized default value or undefined.
     */
    get serializedDefaultValue(): Optional<any>;
    /**
     * Gets deserialized null value.
     *
     * @returns {Nullable<any>} Resolved deserialized null value or undefined.
     */
    get deserializedNullValue(): Nullable<any>;
    /**
     * Gets deserialized default value.
     *
     * @returns {Optional<any>} Resolved deserialized default value or undefined.
     */
    get deserializedDefaultValue(): Optional<any>;
    /**
     * Gets serialized property name.
     *
     * @returns {string} Serialized property name.
     */
    get serializedPropertyName(): string;
    /**
     * Gets deserialized property name.
     *
     * @returns {string} Deserialized property name.
     */
    get deserializedPropertyName(): string;
    /**
     * Gets deserializable value.
     *
     * @returns {boolean} Deserializable indicator.
     */
    get deserializable(): boolean;
    /**
     * Gets generic arguments.
     *
     * @returns {ReadonlyArray<GenericArgument<any>>} Generic arguments.
     */
    get genericArguments(): ReadonlyArray<GenericArgument<any>>;
    /**
     * Gets generic metadatas.
     *
     * @returns {ReadonlyArray<GenericMetadata<any>>} Generic metadatas.
     */
    get genericMetadatas(): ReadonlyArray<GenericMetadata<any>>;
    /**
     * Gets naming convention.
     *
     * @returns {Optional<NamingConvention>} Naming convention or undefined.
     */
    get namingConvention(): Optional<NamingConvention>;
    /**
     * Gets reference handler.
     *
     * @returns {ReferenceHandler} Reference handler.
     */
    get referenceHandler(): ReferenceHandler;
    /**
     * Gets serializable value.
     *
     * @returns {boolean} Serializable indicator.
     */
    get serializable(): boolean;
    /**
     * Gets serializer.
     *
     * @returns {Serializer<TObject>} Serializer.
     */
    get serializer(): Serializer<TObject>;
    /**
     * Gets type argument.
     *
     * @returns {TypeArgument} Type argument.
     */
    get typeArgument(): TypeArgument<TObject>;
    /**
     * Gets type metadata.
     *
     * @returns {TypeMetadata<TObject>} Type metadata.
     */
    get typeMetadata(): TypeMetadata<TObject>;
    /**
     * Gets indicator if null value should be preserved.
     *
     * @returns {boolean} True when null value should be preserved. False otherwise.
     */
    get preserveNull(): boolean;
    /**
     * Gets indicator if default value should be used.
     *
     * @returns {boolean} Use default value indicator.
     */
    get useDefaultValue(): boolean;
    /**
     * Gets indicator if implicit conversion should be used.
     *
     * @returns {boolean} Use implicit conversion indicator.
     */
    get useImplicitConversion(): boolean;
    /**
     * Constructs initial property options by extending passed options
     * with default values if they are not overriden. All references are kept.
     *
     * @param {PropertyOptions<TObject>} propertyOptions Property options.
     *
     * @returns {PropertyOptions<TObject>} Constructed type options.
     */
    private constructPropertyOptions;
    /**
     * Configures property extension metadata.
     *
     * @param {PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>} propertyExtensionMetadataCtor Property extension metadata constructor.
     * @param {TPropertyExtensionOptions} propertyExtensionOptions Property extension options.
     *
     * @returns {TPropertyExtensionMetadata} Property extension metadata
     */
    configurePropertyExtensionMetadata<TPropertyExtensionMetadata extends PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>, TPropertyExtensionOptions extends PropertyExtensionOptions>(propertyExtensionMetadataCtor: PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>, propertyExtensionOptions?: TPropertyExtensionOptions): TPropertyExtensionMetadata;
    /**
     * Extracts property extension metadata.
     *
     * @param {PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>} propertyExtensionMetadataCtor Property extension metadata constructor.
     *
     * @returns {Optional<TPropertyExtensionMetadata>} Property extension metadata or undefined.
     */
    extractPropertyExtensionMetadata<TPropertyExtensionMetadata extends PropertyExtensionMetadata<TDeclaringObject, TObject, TPropertyExtensionOptions>, TPropertyExtensionOptions extends PropertyExtensionOptions>(propertyExtensionMetadataCtor: PropertyExtensionMetadataCtor<TPropertyExtensionMetadata, TPropertyExtensionOptions, TDeclaringObject, TObject>): Optional<TPropertyExtensionMetadata>;
    /**
     * Extracts property extension metadata ctor set from custom value map.
     *
     * @returns {Set<PropertyExtensionMetadataCtor<any, any, any, any>>} Property extension metadata ctor set.
     */
    private extractPropertyExtensionMetadataCtorSet;
    /**
     * Resolves property state.
     *
     * Calling this method has side effects by recomputing property state. If you need current
     * type state then use provided getter for that.
     *
     * @returns {ResolvedPropertyState<TDeclaringObject, TObject>} Resolved property state.
     */
    resolvePropertyState(): ResolvedPropertyState<TDeclaringObject, TObject>;
    /**
     * Unresolves property state.
     *
     * Calling this method has side effects by resetting property state.
     *
     * @returns {UnresolvedPropertyState<TDeclaringObject, TObject>} Unresolved property state.
     */
    unresolvePropertyState(): UnresolvedPropertyState<TDeclaringObject, TObject>;
    /**
     * Resolves custom value map the same way as it is done for the main options.
     *
     * @returns {ReadonlyMap<CustomKey<any>, CustomValue>} Resolved custom value map.
     */
    private resolveCustomValueMap;
    /**
     * Configures alias.
     *
     * @param {Optional<Alias>} alias Alias or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasAlias(alias: Optional<Alias>): this;
    /**
     * Configures custom value map.
     *
     * @param {Optional<Map<CustomKey<any>, CustomValue>>} customValueMap Custom value map or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasCustomValueMap(customValueMap: Optional<Map<CustomKey<any>, CustomValue>>): this;
    /**
     * Configures custom value.
     *
     * @param {CustomKey<TCustomValue>} customKey Custom key.
     * @param {TCustomValue} customValue Custom value.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): this;
    /**
     * Extracts value by custom key.
     *
     * @param {CustomKey<TCustomValue>} customKey Custom key.
     *
     * @returns {TCustomValue} Custom value.
     */
    extractCustomValue<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue;
    /**
     * Configures custom options.
     *
     * @param {ReadonlyArray<CustomOption>} customOptions Custom options.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasCustomOptions(customOptions: ReadonlyArray<CustomOption>): this;
    /**
     * Configures default value.
     *
     * @param {DefaultValue} defaultValue Default value.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasDefaultValue(defaultValue: DefaultValue): this;
    /**
     * Configures serialized default value.
     *
     * @param {DefaultValue} serializedDefaultValue Serialized default value.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): this;
    /**
     * Configures deserialized default value.
     *
     * @param {DefaultValue} deserializedDefaultValue Deserialized default value.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): this;
    /**
     * Configures deserializable.
     *
     * @param {boolean} deserializable Deserializable.
     *
     * @returns {this} Current instance of property metadata.
     */
    isDeserializable(deserializable?: boolean): this;
    /**
     * Configures serializable.
     *
     * @param {boolean} serializable Serializable.
     *
     * @returns {this} Current instance of property metadata.
     */
    isSerializable(serializable?: boolean): this;
    /**
     * Configures generic arguments.
     *
     * @param {Optional<Array<GenericArgument<any>>>} genericArguments Generic arguments or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasGenericArguments(genericArguments: Optional<Array<GenericArgument<any>>>): this;
    /**
     * Configures naming convention.
     *
     * @param {Optional<NamingConvention>} namingConvention Naming convention or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasNamingConvention(namingConvention: Optional<NamingConvention>): this;
    /**
     * Configures reference handler.
     *
     * @param {Optional<ReferenceHandler>} referenceHandler Reference handler or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasReferenceHandler(referenceHandler: Optional<ReferenceHandler>): this;
    /**
     * Configures serializer.
     *
     * @param {Optional<Serializer<TObject>>} serializer Serializer or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasSerializer(serializer: Optional<Serializer<TObject>>): this;
    /**
     * Configures type argument.
     *
     * @param {Optional<TypeArgument<TObject>>} typeArgument Type argument or undefined.
     *
     * @returns {this} Current instance of property metadata.
     */
    hasTypeArgument(typeArgument: Optional<TypeArgument<TObject>>): this;
    /**
     * Configures preserve null.
     *
     * @param {boolean} preserveNull Preserve null.
     *
     * @returns {this} Current instance of property metadata.
     */
    shouldPreserveNull(preserveNull?: boolean): this;
    /**
     * Configures use default value.
     *
     * @param {boolean} useDefaultValue Use default value.
     *
     * @returns {this} Current instance of property metadata.
     */
    shouldUseDefaultValue(useDefaultValue?: boolean): this;
    /**
     * Configures use implicit convertion.
     *
     * @param {boolean} useImplicitConversion Use implicit convertion.
     *
     * @returns {this} Current instance of property metadata.
     */
    shouldUseImplicitConversion(useImplicitConversion?: boolean): this;
    /**
     * Configures property metadata based on provided options.
     *
     * @param {PropertyOptions<TObject>} propertyOptions Property options.
     *
     * @returns {this} Current instance of property metadata.
     */
    configure(propertyOptions: PropertyOptions<TObject>): this;
}
//# sourceMappingURL=property-metadata.d.ts.map