import { QueryParametersRecord, QueryParamTypeMap, QueryParamValue, ValidQueryParamTypeMapKeys } from "../domain/definitions/types/QueryParam";
import { Observable } from "../infrastructure/observer/Observable";
/**
 * Type representing observable query parameters with their corresponding Observable values.
 * @template TParamType The parameter type map.
 * @template TParamNames The valid parameter names from the type map.
 */
export type ObservableQueryParam<TParamType extends QueryParamTypeMap, TParamNames extends ValidQueryParamTypeMapKeys<TParamType> = ValidQueryParamTypeMapKeys<TParamType>> = {
    [K in TParamNames]: Observable<QueryParamValue<TParamType[K]>>;
};
/**
 * Manages URL hash search parameters with type safety and observability.
 * @template TParamType The parameter type map defining parameter types.
 * @template TParamNames The valid parameter names from the type map.
 */
export declare class URLHashSearchParams<TParamType extends QueryParamTypeMap, TParamNames extends ValidQueryParamTypeMapKeys<TParamType> = ValidQueryParamTypeMapKeys<TParamType>> {
    /**
     * Normalized parameter definitions with all properties required.
     */
    private readonly _parameters;
    /**
     * Array of parameter entries containing name and definition pairs.
     */
    private readonly _parameterEntries;
    /**
     * Proxy object providing access to parameter observables.
     */
    private readonly _parametersProxy;
    /**
     * Cache storing parameter observables.
     */
    private readonly _observableCache;
    /**
     * Flag indicating whether parameters should be written to the URL.
     */
    private readonly _writeParamToURL;
    constructor(queryParamRecord: QueryParametersRecord<TParamType>);
    constructor(queryParamRecord: QueryParametersRecord<TParamType>, internalWriteParamOverride: boolean);
    /**
     * @returns {ObservableQueryParam<TParamType, TParamNames>} The parameters proxy.
     */
    get params(): ObservableQueryParam<TParamType, TParamNames>;
    /**
     * Initializes search parameters in the URL hash.
     * Sets default values and synchronizes with current URL state.
     */
    initializeSearchParams: () => void;
    /**
     * Initializes the parameters record with normalized definitions.
     * @returns {RequiredQueryParametersRecord<TParamType>} The normalized parameters record.
     */
    private _initializeParams;
    /**
     * Creates a proxy object for parameter observables.
     * @returns {ObservableQueryParam<TParamType, TParamNames>} The parameters proxy.
     */
    private _createParamsProxy;
    /**
     * Normalizes a parameter definition by ensuring all properties are defined.
     * @template K The valid parameter names from the type map.
     * @template TParamType The parameter type map defining parameter types.
     * @param {QueryParameterDefinition<TParamType[K]>} def - The parameter definition to normalize.
     * @returns {Required<QueryParameterDefinition<TParamType[K]>>} The normalized definition.
     */
    private _normalizeParameterDefinition;
    /**
     * Validates if a parameter name exists in the parameters record.
     * @template K The parameter name type.
     * @param {K} name The parameter name to validate.
     * @returns {boolean} True if the parameter exists, false otherwise.
     * @throws {InvalidUrlParameterError} If the parameter name is invalid.
     */
    private _validateParamNameExists;
    /**
     * Gets or creates an Observable for a parameter.
     * @template K The parameter name type.
     * @template TParamType The parameter type map defining parameter types.
     * @param {K} name The parameter name.
     * @returns {Observable<QueryParamValue<TParamType[K]>>} The Observable for the parameter.
     */
    private _getOrCreateObservable;
    /**
     * Retrieves the value of a search parameter.
     * @template K The parameter name type.
     * @template TParamType The parameter type map defining parameter types.
     * @param {K} name The parameter name.
     * @returns {QueryParamValue<TParamType[K]>} The parameter value.
     *
     */
    private _getSearchParamValue;
    /**
     * Parses a URL value according to the parameter's expected type.
     * @template K The parameter name type.
     * @template TParamType The parameter type map defining parameter types.
     * @param {string | null} value The raw URL value.
     * @param {QueryParamValue<TParamType[K]>} defaultValue The default value used to determine the expected type.
     * @returns {QueryParamValue<TParamType[K]> | null} The parsed value or null if parsing fails.
     */
    private _parseUrlValue;
}
