interface State {
status: Status;
sourceXPath: string;
sourceXPathTimeout: number;
targetLink: string;
}
settingsStorage.watch((newValue) => {
if (newValue) {
useSettingsStore.dispatch({
type: 'update',
update(draftState) {
const state = newValue.state;
Object.keys(state).forEach((key) => {
// @ts-expect-error
draftState[key as keyof State] = state[key as keyof State];
});
},
});
}
});
type Draft<T> = T extends PrimitiveType ? T : T extends AtomicObject ? T : T extends ReadonlyMap<infer K, infer V> ? Map<Draft<K>, Draft<V>> : T extends ReadonlySet<infer V> ? Set<Draft<V>> : T extends WeakReferences ? T : T extends object ? WritableDraft<T> : T;
type WritableDraft<T> = {
-readonly [K in keyof T]: Draft<T[K]>;
};
draftState 是一个 Draft<State> 对象,是 immer 中的草稿对象。其 key 和 State 的 key 是一一对应的。
目前是使用 // @ts-expect-error 来抑制类型错误,应该怎么对 key 设置类型,才能避免类型错误?
AI 的答案是使用
interface State {
// 定义你的 State 结构
[key: string]: any;
}
但是这样会抹掉 State 的所有的类型信息