Skip to content

Commit 7d2525e

Browse files
refactor: Relax types for persist middleware (#2332)
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`
1 parent 8c1a1f0 commit 7d2525e

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

src/middleware/persist.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import type {
66

77
export interface StateStorage {
88
getItem: (name: string) => string | null | Promise<string | null>
9-
setItem: (name: string, value: string) => void | Promise<void>
10-
removeItem: (name: string) => void | Promise<void>
9+
setItem: (name: string, value: string) => unknown | Promise<unknown>
10+
removeItem: (name: string) => unknown | Promise<unknown>
1111
}
1212

1313
export type StorageValue<S> = {
@@ -19,8 +19,8 @@ export interface PersistStorage<S> {
1919
getItem: (
2020
name: string,
2121
) => StorageValue<S> | null | Promise<StorageValue<S> | null>
22-
setItem: (name: string, value: StorageValue<S>) => void | Promise<void>
23-
removeItem: (name: string) => void | Promise<void>
22+
setItem: (name: string, value: StorageValue<S>) => unknown | Promise<unknown>
23+
removeItem: (name: string) => unknown | Promise<unknown>
2424
}
2525

2626
type JsonStorageOptions = {
@@ -401,7 +401,7 @@ const newImpl: PersistImpl = (config, baseOptions) => (set, get, api) => {
401401
)
402402
}
403403

404-
const setItem = (): void | Promise<void> => {
404+
const setItem = () => {
405405
const state = options.partialize({ ...get() })
406406
return (storage as PersistStorage<S>).setItem(options.name, {
407407
state,

0 commit comments

Comments
 (0)