import type { GroupKey } from "@arcgis/core/core/Accessor.js";
import Handles from "@arcgis/core/core/Handles.js";
type DestroyResult = void | Promise<void>;
type Constructor<TInstance = object> = abstract new (...args: any[]) => TInstance;
interface HasDestroy<TResult extends DestroyResult = DestroyResult> {
    destroy(): TResult;
}
type DestroyResultOf<TConstructor extends Constructor> = InstanceType<TConstructor> extends HasDestroy<infer TResult> ? TResult : void;
type HandlesConstructor<TBase extends Constructor> = abstract new (...args: ConstructorParameters<TBase>) => InstanceType<TBase> & HandlesMixin<DestroyResultOf<TBase>>;
/**
 * Supporting mixin declaration for {@link handles}.
 */
export declare class HandlesMixin<TResult extends DestroyResult = void> {
    protected readonly _handles: Handles<GroupKey<unknown>>;
    destroy(): TResult;
}
/**
 * Adds a protected _handles property backed by Esri handles.
 */
export declare function handles(): abstract new () => HandlesMixin<void>;
/**
 * Adds a protected _handles property backed by Esri handles.
 *
 * @param obj The base class to add handles to.
 */
export declare function handles<TBase extends Constructor>(obj: TBase): HandlesConstructor<TBase>;
export {};
