Состояние immer docs «Ключи карты никогда не составляются! Это сделано для того, чтобы избежать путаницы в семантике и держать ключи всегда равными по ссылкам», но мне сложно понять, что имеется в виду этим.
Я ожидал, что это будет означать, что использование чернового объекта в качестве ключа в черновике Map
/ Set
автоматически разыменовывает ключ, как если бы я звонил, например, map.set(original(key) || key, value)
. Однако, похоже, это не так, и я не могу понять, что подразумевается под этим утверждением.
Вот несколько примеров, демонстрирующих, что я имею в виду. Я ожидал true
для всех этих журналов.
const { enableMapSet, produce } = immer;
enableMapSet();
const collection = {
map: new Map(),
set: new Set(),
storedAsObject: {},
storedAsDraft: {},
};
collection.set.add(collection.storedAsObject);
collection.map.set(collection.storedAsObject, 'value');
const newCollection = produce(collection, (draft) => {
console.log(draft.set.has(draft.storedAsObject)); // false
console.log(draft.map.has(draft.storedAsObject)); // false
draft.set.add(draft.storedAsDraft);
draft.map.set(draft.storedAsDraft, 'value');
});
console.log(newCollection.set.has(newCollection.storedAsDraft)); // true
console.log(newCollection.map.has(newCollection.storedAsDraft)); // false
<script src="https://unpkg.com/immer@6.0.3/dist/immer.umd.production.min.js"></script>
В частности, разница в последних двух кажется ошибкой, но особое поведение, о котором говорят доктора, это только вызов карт, поэтому я не уверен.