Reassigning to the same Date object generates new copy with empty patches

未关闭
#858 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 4 天内回复

@oriondean 已经在做这个了。

开始于 2026年5月8日。

  • #1235 来自 @oriondean —— 未关闭

评估

难度
3/5
预计耗时
1-2 天
新手友好度
45/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
领域
tooling

调研方向

从链接的 CodeSandbox 复现和入口点 produceWithPatches 开始,检查报告中所述的 Proxy 和 ES5 模式下的行为。当撤销 Date 赋值后返回原始数组 identity,同时在两个环境中仍生成空的 patch 集合时,修复即完成。

由索引模型根据 Issue 内容生成。

描述

complexity-medium PR welcome

🐛 Bug Report

If you mutate Date property inside produce but then revert it, immer still assumes changes while returning an empty set of patches.

Link to repro

https://codesandbox.io/s/immer-reassigning-breaks-immutabillity-2u7ob


import {enablePatches, produceWithPatches} from "immer"

enablePatches();

type DataObject = { 
  date: Date;
}

let initialDate = new Date();
let data: DataObject[] = [{date: initialDate}];

let [newData, patches] = produceWithPatches(data, draft => {
  let element = draft[0];
  let dateBefore = element.date;
 
  element.date = new Date()
  element.date = dateBefore;
});

console.log("Patches:", patches) // []
console.log("New Date equal to Initial", newData[0].date === initialDate) // true
console.log("Array equal", newData === data); // expect true but getting false

Environment

Immer version: 9.0.6

  • I filed this report against the latest version of Immer
  • Occurs with setUseProxies(true)
  • Occurs with setUseProxies(false) (ES5 only)
主要语言
JavaScript
星标
29k
派生
905
平均合并
3 天 16 小时
30 天内合并 PR
22

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

immerjs/immer 的其他 Issue

查看 immerjs/immer 的全部 Issue

相似的 Issue

更多 JavaScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。