我正在尝试为solid-js 制作一个自定义“钩子”,它将从本地存储中检索状态。
import { Accessor, createSignal, Setter } from "solid-js";
export default function createLocalStorageSignal<T extends string>(key: string): [get: Accessor<T>, set: Setter<T>] {
const storage = window.localStorage;
const initialValue: T = JSON.parse(storage.getItem(key) ?? '{}').value;
const [value,setValue] = createSignal<T>(initialValue);
const newSetValue: Setter<T> = (newValue) => {
setValue(newValue);
storage.setItem(key, JSON.stringify({value: newValue}));
return newValue;
}
return [
value,
newSetValue
]
}
但是我收到类型错误
Type '(newValue: any) => void' is not assignable to type 'Setter<T>'
为什么不能推断 newValue 的类型?如果无法推断,我应该将其设置为什么?
EDIT:
Setter<T>
的完整类型是
type Setter<T> = undefined extends T ?
<U extends T>
(v?: (U extends Function ? never : U) |
((prev?: T | undefined) => U) | undefined) => U :
<U extends T>
(v: (U extends Function ? never : U) |
((prev: T) => U)) => U
我不太明白其目的U
类型及其工作原理。我认为问题与 newValue 可能是一个函数但 T 类型也可能是一个函数类型或其他东西有关......
建立在trusktr 的回答,简化setValue
包装函数并添加参数defaultValue
and storage
(所以你可以使用sessionStorage
如果你想):
function createStoredSignal<T>(
key: string,
defaultValue: T,
storage = localStorage
): Signal<T> {
const initialValue = storage.getItem(key)
? JSON.parse(storage.getItem(key)) as T
: defaultValue;
const [value, setValue] = createSignal<T>(initialValue);
const setValueAndStore = ((arg) => {
const v = setValue(arg);
storage.setItem(key, JSON.stringify(v));
return v;
}) as typeof setValue;
return [value, setValueAndStore];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)