【问题标题】:Why is yelded object '#<Object>' read-only?为什么yelded对象'#<Object>'是只读的?
【发布时间】:2020-03-05 03:07:38
【问题描述】:

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

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

【问题讨论】:

  • 请告诉我们您如何定义projects,以及Folder 类型是如何声明的。

标签: javascript typescript iterator yield


【解决方案1】:

啊 - 我的问题是我在减速器中使用了 immer(某处备份树),在某些时候这个实例被浅克隆并传递给我的减速器(它是假数据库的数据)。

通过在从我的假数据库返回任何数据之前进行深度克隆来修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2018-11-24
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多