如何在更新 immer 上的草稿时动态添加新属性?

ste*_*wpf 6 typescript immer.js

考虑以下代码,其中第 2 行失败并显示Property 'newProperty' does not exist on type 'WritableDraft<MyObject>'. TS7053

// data is of type MyObject which until now has only a property myNumber
const payload = produce(data, (draft) => {    
  draft['newProperty'] = 'test';              // Property 'newProperty' does not exist on type 'WritableDraft<MyObject>'.  TS7053
});                                           
Run Code Online (Sandbox Code Playgroud)

如何动态地将新属性添加到草稿或将草稿的类型更改为已包含 的类型newProperty?我不想newPropertyMyObject类型本身中拥有。

Joh*_*ann 1

您可以使用联合运算符将新属性添加到预先存在的类型:&。下面的代码应该可以解决您的问题。

(draft: WritableDraft<MyObject> & { newProperty : string }) => {
  // put the rest of your code here
}
Run Code Online (Sandbox Code Playgroud)

编辑

看了 Linda Paiste 的回答后,我认为我上面采取的方法存在一些问题。我的答案确实向类型添加了一个属性,这可以消除您在访问或修改newProperty函数中的属性时遇到的任何错误。但是,如果将来类型或变量名称发生更改,它会更加冗长且难以维护。此外,它还强制函数的调用者传入包含该newProperty属性的对象,这可能不是您想要的。