更新 immerjs 中的嵌套 prop 导致“无法分配给只读属性”异常

csi*_*sim 5 javascript ngrx angular immer.js

我正在尝试更新我的一个对象上的嵌套道具,我相信根据文档,它应该完全像那样工作。只是需要明确的是,该州有一个课程列表,每个课程都有一个模块列表,并且相关模块有一个我正在尝试设置的属性。

on(setBootstrapScript, (state, action) => {
    return produce(state, (draft) => {
      const index = draft.lessons[action.lessonId].modules.findIndex(
        (module) => module.uuid === action.moduleId,
      );
      if (index !== -1) {
        draft.lessons[action.lessonId].modules[
          index
        ].bootstrapScript = action.bootstrapScript;
      }
    });
  })
Run Code Online (Sandbox Code Playgroud)

注意:我知道有类似ngrx-etc或 之ngrx-immer类的实用程序具有mutableOn功能,但这不是这里的问题。它应该仍然像这样工作。

在这样的测试中使用它时效果很好

test('setBootstrapScript should set the correct database bootstrap script', async () => {
    let results = reducer(
      initialState,
      setBootstrapScript({
        lessonId: 0,
        moduleId: 1,
        bootstrapScript: 'CREATE NEW TABLE;',
      }),
    );
    expect(results.lessons[0].modules[0]).toEqual(
      expect.objectContaining({
        bootstrapScript: 'CREATE NEW TABLE;',
      }),
    );
  });
Run Code Online (Sandbox Code Playgroud)

但在浏览器中使用它会导致

core.js:6210 ERROR TypeError: Cannot assign to read only property 'bootstrapScript' of object '[object Object]'
Run Code Online (Sandbox Code Playgroud)

我不确定我到底做错了什么,因为 immer 应该允许我像这样更新状态。由于浸入器会关闭自动冷冻功能,因此它在生产中运行良好。由于某种原因,模块(或模块的属性)被设置为 writable false。

任何指点将不胜感激,谢谢。