为什么我没有消除 Typescript 中的 TS2322 错误?

问题描述 投票:0回答:1

我正在开发这个 React 演示项目,其中使用了 redux。该应用程序的逻辑是完全基本的,只是为了练习目的,但一个未知的错误让我不知所措。我定义了一个 redux 存储并在两个组件中使用它,应用程序正常工作,浏览器控制台中没有警告,但无论我如何尝试修改代码,IDE 中的错误都不会消失。

如果有人能帮助我,我将不胜感激。

<html>TS2322: Type 'Reducer&lt;ItemState&gt;' is not assignable to type 'Reducer&lt;ItemState, UnknownAction, Task[]&gt;'.<br/>Types of parameters 'state' and 'state' are incompatible.<br/>Type 'ItemState | Task[] | undefined' is not assignable to type 'ItemState | undefined'.<br/>Property 'tasks' is missing in type 'Task[]' but required in type 'ItemState'.

这就是 redux 存储的定义方式:

import {configureStore, createSlice, PayloadAction} from '@reduxjs/toolkit'

interface Task {
    id: number,
    title: string
    description: string
    date: any
}

interface ItemState {
    tasks: Task[]   
}

interface RootState {
    tasks: ItemState
}

const saveState = (state: ItemState) => {
    const savedState = JSON.stringify(state)
    localStorage.setItem('saveFile', savedState)
}

const loadState = (): ItemState | undefined => {
    const savedState = localStorage.getItem('saveFile')
    if (savedState) {
        const parsedState = JSON.parse(savedState)
        return {tasks: parsedState || []}
    }
    return undefined
}

const itemSlice = createSlice({
    name: 'addNew',
    initialState: {tasks: []} as ItemState,
    reducers: {
        addNewTask(state, action: PayloadAction<Task>) {
            state.tasks.push(action.payload)
        }
    }
})

const mainStore = configureStore({
    reducer: {tasks: itemSlice.reducer},
    preloadedState: loadState()
})

mainStore.subscribe(() => {
    saveState(mainStore.getState().tasks)
})

export default mainStore;
export type {RootState}
export const reduxActions = itemSlice.actions
export {itemSlice}

我认为没有必要在其他组件中共享存储用法,因为当我添加本地存储(特别是 lodadState() 函数)时发生错误。

reactjs typescript react-redux react-typescript react-tsx
1个回答
0
投票

问题

问题是

saveState
只保留 state.tasks 状态,但 preloadedState 需要一个
整个
状态对象,例如RootState 类型,但 loadState 只返回 
state.tasks
ItemState
类型对象。
解决方案建议

保持整个状态:

    const saveState = (state: RootState) => { // <-- entire state const savedState = JSON.stringify(state); localStorage.setItem("saveFile", savedState); }; const loadState = (): RootState | undefined => { const savedState = localStorage.getItem("saveFile"); if (savedState) { const parsedState = JSON.parse(savedState); return { tasks: parsedState || [] }; // <-- entire state } return undefined; }; const mainStore = configureStore({ reducer: { tasks: itemSlice.reducer, }, preloadedState: loadState(), // <-- entire state }); mainStore.subscribe(() => { saveState(mainStore.getState()); // <-- entire state });
  • 修复逻辑以仅加载部分
    state.tasks
  • 状态:
  • const saveState = (state: ItemState) => { // <-- state.tasks const savedState = JSON.stringify(state); localStorage.setItem("saveFile", savedState); }; const loadState = (): RootState | undefined => { const savedState = localStorage.getItem("saveFile"); if (savedState) { const parsedState = JSON.parse(savedState); return { tasks: { tasks: parsedState || [] }}; // <-- entire state } return undefined; }; const mainStore = configureStore({ reducer: { tasks: itemSlice.reducer, }, preloadedState: loadState(), // <-- entire state }); mainStore.subscribe(() => { saveState(mainStore.getState().tasks); // <-- state.tasks });

    
    

    	
© www.soinside.com 2019 - 2024. All rights reserved.