Как immer обрабатывает ключи объектов с картами и наборами? - PullRequest
0 голосов
/ 24 апреля 2020

Состояние 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>

В частности, разница в последних двух кажется ошибкой, но особое поведение, о котором говорят доктора, это только вызов карт, поэтому я не уверен.

...