type Store = typeof localStorage | typeof sessionStorage type SetTransform = (args: T) => string type GetTransform = (args: null | string) => T export function get(store: Store, name: string): string | null export function get( store: Store, name: string, transform: GetTransform ): T export function get( store: Store, name: string, transform?: GetTransform ) { const value = store.getItem(name) if (transform) { return transform(value) } else { return value } } export function set(store: Store, name: string, value: string): string export function set( store: Store, name: string, value: T, transform: SetTransform ): string export function set( store: Store, name: string, value: T, transform?: SetTransform ) { store.setItem(name, transform ? transform(value) : (value as string)) return value } export function getFactory(store: Store): (name: string) => string | null export function getFactory( store: Store, transform: GetTransform ): (name: string | null) => T export function getFactory(store: Store, transform?: GetTransform) { return (name: string | null) => transform ? get(store, name!, transform) : get(store, name!) } export function setFactory( store: Store ): (name: string, value: string) => string export function setFactory( store: Store, transform: SetTransform ): (name: string, value: T) => string export function setFactory(store: Store, transform?: SetTransform) { return (name: string, value: T) => transform ? set(store, name, transform(value)) : set(store, name, value as string) } export function localGetFactory(): (name: string) => string | null export function localGetFactory( transform: GetTransform ): (name: string | null) => T export function localGetFactory(transform?: GetTransform) { return getFactory(localStorage, transform!) } export function localSetFactory(): (name: string, value: string) => string export function localSetFactory( transform: SetTransform ): (name: string, value: T) => string export function localSetFactory(transform?: SetTransform) { return setFactory(localStorage, transform!) } export function localDel(key: string) { localStorage.removeItem(key) } export const local = { get: localGetFactory(), set: localSetFactory(), del: localDel }