import type { Dispatch, SetStateAction } from 'react';
type Parse<T> = (value: string) => T;
type Stringify<T> = (value: T) => string;
interface Options<T> {
    key?: string;
    parse?: Parse<T>;
    stringify?: Stringify<T>;
}
/**
 * Hook to use a state that is persisted in local storage.
 *
 * If the key is not defined, it's a normal useState hook. The only difference is that the initial value is always undefined.
 *
 * If the key is defined, the initial value is loaded from local storage, and the value is persisted in local storage after each change.
 *
 * If the key changes, the value is updated from local storage. If the new key is undefined, the value does not change.
 * Note that the values stored with a previous key are maintained.
 * TODO(SL): add a way to delete them?
 *
 * @param options
 * @param [string | undefined] options.key The key to use in local storage. If undefined, the value is not persisted.
 * @param [function] options.parse A function to parse the value from local storage. If not provided, JSON.parse is used.
 * @param [function] options.stringify A function to stringify the value to local storage. If not provided, JSON.stringify is used.
 *
 * @returns [T | undefined, Dispatch<SetStateAction<T | undefined>>] The value and the setter.
 */
export declare function useLocalStorageState<T>({ key, parse, stringify }?: Options<T>): [T | undefined, Dispatch<SetStateAction<T | undefined>>];
export {};
