From dc37084f92776b2793c39af59b89734ef025366c Mon Sep 17 00:00:00 2001 From: Rafael Date: Mon, 12 Feb 2024 17:59:30 -0300 Subject: [PATCH] refactor: Relax types for `persist` middleware Right now, we're requiring new `StateStorage` implementations to forcefully return `void` from inside `setItem` and `removeItem`. When using a library that returns the set value for `setItem` or `removeItem`, therefore returning a `string`, it causes Typescript to fail, requiring some weird workarounds. For example, when using `localforage` (https://github.com/localForage/localForage) one needs to do what we describe below. Notice the `void` keyword. ```typescript const storage: StateStorage = { ...localForage, setItem: void localForage.setItem.bind(localForage) } ``` Another, longer, alternative is ```typescript const storage: StateStorage = { ...localForage, // Curly braces are required because we need to "return `void`" setItem: (name, value) => { localStorage.setItem(name, value) } } ``` By changing the type implementation to ignore types - using unknown - we can simply use `localforage` - and similar libraries - as if we were using `window.localStorage` --- src/middleware/persist.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/middleware/persist.ts b/src/middleware/persist.ts index e6eb5e1305..b56f531cde 100644 --- a/src/middleware/persist.ts +++ b/src/middleware/persist.ts @@ -6,8 +6,8 @@ import type { export interface StateStorage { getItem: (name: string) => string | null | Promise - setItem: (name: string, value: string) => void | Promise - removeItem: (name: string) => void | Promise + setItem: (name: string, value: string) => unknown | Promise + removeItem: (name: string) => unknown | Promise } export type StorageValue = { @@ -19,8 +19,8 @@ export interface PersistStorage { getItem: ( name: string, ) => StorageValue | null | Promise | null> - setItem: (name: string, value: StorageValue) => void | Promise - removeItem: (name: string) => void | Promise + setItem: (name: string, value: StorageValue) => unknown | Promise + removeItem: (name: string) => unknown | Promise } type JsonStorageOptions = { @@ -401,7 +401,7 @@ const newImpl: PersistImpl = (config, baseOptions) => (set, get, api) => { ) } - const setItem = (): void | Promise => { + const setItem = () => { const state = options.partialize({ ...get() }) return (storage as PersistStorage).setItem(options.name, { state,