排查代码中触发Immer报错‘仅支持设置数组索引与length属性’的原因
解析Immer报错“Immer only supports setting array indices and the 'length' property”的原因
让我帮你拆解一下这个问题,其实根源出在你的初始状态设置上——哪怕你现在只修改status字段,也会触发这个错误:
初始状态的类型与实际值不匹配:你定义的
FoodLogs类型里,foodLogs是Array<FoodLogState>类型,但在initialState里却把它设成了null。Redux Toolkit依赖Immer来处理不可变状态,Immer会根据你声明的类型和实际值创建代理对象。当实际值是null但预期是数组时,Immer的内部代理逻辑会混乱:它会尝试把null当作数组类型去处理,哪怕你只是修改其他字段,也会触发这个数组相关的错误。为什么之前类似操作没问题?:你提到之前做过类似操作没报错,大概率是因为当时你把
foodLogs的初始值设成了空数组[]而不是null。这样Immer能正确识别数组类型并创建对应的代理,自然不会触发这个错误。
修复方案
只需要把初始状态里的foodLogs从null改成空数组即可:
const initialState: FoodLogs = { foodLogs: [], // 替换原有的null status: "idle", };
另外,建议你确认getFoodState返回的response确实是Array<FoodLogState>类型,这样后续放开注释里的state.foodLogs = action.payload时,也能保证类型匹配,避免再次出现类似问题。
内容的提问来源于stack exchange,提问作者user275564
相关产品推荐
相关产品推荐

