/**
 * Compare two accessor specs for equivalence.
 * - Same reference: always equivalent (`===`)
 * - String accessors: exact string match
 * - Function accessors: `.toString()` comparison (catches inline arrow functions
 *   like `d => d.value` that are recreated on every render but have identical source)
 * - Mismatched types or undefined vs defined: not equivalent
 *
 * **Known limitation**: `.toString()` compares source text, not closure bindings.
 * Two functions with identical source but different captured variables will appear
 * equivalent. For closures that depend on changing values, use `useCallback` with
 * the variable in the dependency array so the reference changes when behavior changes.
 */
export declare function accessorsEquivalent(a: string | ((...args: any[]) => any) | undefined, b: string | ((...args: any[]) => any) | undefined): boolean;
export type CoercibleNumber = number | Date | string;
export declare function resolveAccessor<T extends Record<string, unknown>>(accessor: string | ((d: T) => CoercibleNumber) | undefined, fallback: string): (d: T) => number;
export declare function resolveRawAccessor<T extends Record<string, unknown>>(accessor: string | ((d: T) => unknown) | undefined, fallback: string): (d: T) => unknown;
export declare function resolveStringAccessor<T extends Record<string, unknown>>(accessor: string | ((d: T) => string) | undefined, fallback?: string): ((d: T) => string) | undefined;
