import Collection from "@arcgis/core/core/Collection";
import type { SerializeMode } from "./Serializable.js";
import { SerializableBase } from "./Serializable.js";
/**
 * A type that maps event names to their corresponding event object types for an
 * instance of {@link Settings}.
 */
export interface SettingsEvents<T> {
    /**
     * Fires when a setting is changed, either locally or by a parent settings
     * instance. The event object contains the name of the setting that
     * changed.
     */
    "property-change": {
        property: keyof T;
    };
}
declare const Settings_base: (abstract new (_properties?: unknown) => SerializableBase<unknown>) & (abstract new (...args: any[]) => import("./observableUtils.js").ObservableMixin);
/**
 * Helper class for implementing a collection of settings that can be inherited
 * at runtime from a parent collection of settings. Setting a value locally will
 * override the inherited setting.
 */
export declare abstract class Settings<TProperties> extends Settings_base {
    /**
     * @deprecated Do not directly reference this property. Use EventNames and
     *   EventTypes helpers from @arcgis/core/Evented.
     */
    "@eventTypes": SettingsEvents<this>;
    private _parent;
    private _parentHandle;
    /**
     * Locally overridden setting values, keyed by setting name.
     */
    private _overrides;
    /**
     * The parent settings that these settings will inherit from.
     */
    get parent(): this | undefined;
    set parent(value: this | undefined);
    /**
     * Removes all local overrides, resetting all settings to their inherited
     * values, if any.
     */
    reset(): void;
    /**
     * Removes a local override for a setting and resets it to its inherited
     * value, if any.
     *
     * @param setting The setting to reset.
     */
    reset(setting: keyof this): void;
    /**
     * Determines whether the settings have been locally modified in any way.
     */
    isModified(): boolean;
    /**
     * Determines whether the specified setting has been locally modified, and
     * is thus overriding any inherited value.
     *
     * @param setting The setting to check.
     */
    isModified(setting: keyof this): boolean;
    toJSON(serializeMode?: SerializeMode): TProperties;
    getDefaults(): TProperties;
    /**
     * Determines whether the specified setting has been modified locally or by
     * any parent of the current settings instance.
     *
     * @param setting The setting to check.
     */
    protected _hasSettingIncludingAncestor<K extends keyof this>(setting: K): boolean;
    /**
     * Gets the value for a setting.
     *
     * @param setting The setting name.
     * @param defaultValue The default value if the setting is not explicitly
     *   set.
     */
    protected _getSetting<K extends keyof this>(setting: K, defaultValue?: this[K]): this[K];
    /**
     * Gets the value for a setting that represents a collection.
     *
     * @param setting The setting name.
     */
    protected _getCollectionSetting<T>(setting: keyof this): Collection<T>;
    /**
     * Gets a property which is itself an instance of Settings.
     *
     * @param setting The setting name.
     * @param factory A factory for creating the nested settings.
     */
    protected _getNestedSettings<T extends Settings<unknown>>(setting: keyof this, factory: () => T): T;
    /**
     * Sets the value for a setting. This will override any inherited value for
     * the setting.
     *
     * @param setting The setting name.
     * @param value The setting value.
     */
    protected _setSetting<K extends keyof this>(setting: K, value: this[K]): void;
    /**
     * Sets the parent settings that these settings will inherit from.
     *
     * @param parent The parent settings to inherit from.
     */
    protected _setParent(parent: this | undefined): void;
    private _notifySettingChange;
}
export {};
