我已经使用yield实现了一个简单的搜索-通过递归文件夹结构运行,屈服所有文件夹。我的实现非常简单,并且删除了所有“ const”(以防万一)]
function *folders(f: Folder) : IterableIterator<Folder> {
yield f;
if (f.folders)
{
for (let sf of f.folders) {
yield* folders(sf);
}
}
}
function *allFolders() : IterableIterator<Folder> {
for (let p of projects) {
yield* folders(p.project.rootFolder!)
}
}
当我尝试修改返回的对象时
let folders = allFolders();
let t = folders.next().value;
t.name = "sdvs";
我知道
TypeError: Cannot assign to read only property 'name' of object '#<Object>'
如果我直接访问该对象(在此文件中位于全局范围内),就可以了。我现在已经花了几个小时,并感到非常困惑。这根本不可能吗?为什么会发生这种情况?
啊-我的问题是我在减速器中使用了immer(在某种程度上备份了树),在某些时候,该实例被浅表克隆并传递给了我的减速器(这是一个伪DB的数据)。
通过从我的假数据库返回任何数据之前进行深层克隆来解决。