type StorageType = 'localStorage' | 'sessionStorage';
type NotUndefined<T> = T extends undefined ? never : T;
type StateHookTuple<T> = readonly [T, React.Dispatch<React.SetStateAction<T | null>>];
type CustomStorageEvent = CustomEvent<string>;
declare global {
    interface WindowEventMap {
        'foxact-use-local-storage': CustomStorageEvent;
        'foxact-use-session-storage': CustomStorageEvent;
    }
}
type Serializer<T> = (value: T) => string;
type Deserializer<T> = (value: string) => T;
interface UseStorageRawOption {
    raw: true;
}
interface UseStorageParserOption<T> {
    raw?: false;
    serializer: Serializer<T>;
    deserializer: Deserializer<T>;
}
declare function createStorage(type: StorageType): {
    useStorageValue: {
        <T>(key: string, serverValue: NotUndefined<T>, options?: UseStorageRawOption | UseStorageParserOption<T>): T;
        <T>(key: string, serverValue?: undefined, options?: UseStorageRawOption | UseStorageParserOption<T>): T | null;
    };
    useSetStorage: <T>(key: string, options?: UseStorageRawOption | UseStorageParserOption<T>) => (v: React.SetStateAction<T | null>) => void;
    useStorage: {
        <T>(key: string, serverValue: NotUndefined<T>, options?: UseStorageRawOption | UseStorageParserOption<T>): StateHookTuple<T>;
        <T>(key: string, serverValue?: undefined, options?: UseStorageRawOption | UseStorageParserOption<T>): StateHookTuple<T | null>;
    };
};

export { createStorage };
export type { Deserializer, NotUndefined, Serializer, StateHookTuple, StorageType, UseStorageParserOption, UseStorageRawOption };
