为什么产生的对象'#'只读?

问题描述 投票:0回答:1

我已经使用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>'

如果我直接访问该对象(在此文件中位于全局范围内),就可以了。我现在已经花了几个小时,并感到非常困惑。这根本不可能吗?为什么会发生这种情况?

javascript typescript iterator yield
1个回答
0
投票

啊-我的问题是我在减速器中使用了immer(在某种程度上备份了树),在某些时候,该实例被浅表克隆并传递给了我的减速器(这是一个伪DB的数据)。

通过从我的假数据库返回任何数据之前进行深层克隆来解决。

© www.soinside.com 2019 - 2024. All rights reserved.