Почему объект "# <Object>" только для чтения? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть простой поиск, который я реализовал с помощью 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>'

Если я получу доступ к объекту напрямую (он находится в глобальном масштабе в этом файле), все в порядке. Я потратил несколько часов на это сейчас, и я совершенно сбит с толку. Это просто невозможно? Почему это может происходить?

1 Ответ

0 голосов
/ 08 ноября 2019

Ах, моя проблема заключалась в том, что я использовал immer в своем редукторе (где-то далеко вверх по дереву), в какой-то момент этот экземпляр был клонирован и передан моему редуктору (это данные для поддельной БД).

Исправлено выполнением глубокого клона перед возвратом любых данных из моей поддельной БД.

...