Map en Set
Deze pagina is vertaald door PageTurner AI (beta). Niet officieel goedgekeurd door het project. Een fout gevonden? Probleem melden →
âš Vanaf versie 6 moet ondersteuning voor Maps en Sets expliciet worden ingeschakeld door enableMapSet() eenmaal aan te roepen bij het opstarten van je applicatie.
Eenvoudige objecten, arrays, Maps en Sets worden altijd gedraft door Immer. Een voorbeeld van het gebruik van Maps met Immer:
test("Producers can update Maps", () => {
const usersById_v1 = new Map()
const usersById_v2 = produce(usersById_v1, draft => {
// Modifying a map results in a new map
draft.set("michel", {name: "Michel Weststrate", country: "NL"})
})
const usersById_v3 = produce(usersById_v2, draft => {
// Making a change deep inside a map, results in a new map as well!
draft.get("michel").country = "UK"
})
// We got a new map each time!
expect(usersById_v2).not.toBe(usersById_v1)
expect(usersById_v3).not.toBe(usersById_v2)
// With different content obviously
expect(usersById_v1).toMatchInlineSnapshot(`Map {}`)
expect(usersById_v2).toMatchInlineSnapshot(`
Map {
"michel" => Object {
"country": "NL",
"name": "Michel Weststrate",
},
}
`)
expect(usersById_v3).toMatchInlineSnapshot(`
Map {
"michel" => Object {
"country": "UK",
"name": "Michel Weststrate",
},
}
`)
// The old one was never modified
expect(usersById_v1.size).toBe(0)
// And trying to change a Map outside a producers is going to: NO!
expect(() => usersById_v3.clear()).toThrowErrorMatchingInlineSnapshot(
`"This object has been frozen and should not be mutated"`
)
})
Maps en Sets die door Immer worden geproduceerd, worden kunstmatig onveranderlijk gemaakt. Dit betekent dat ze een uitzondering zullen werpen wanneer je mutatieve methoden zoals set, clear, enz. probeert aan te roepen buiten een producer.
Let op: De keys van een map worden nooit gedraft! Dit wordt gedaan om verwarrende semantiek te voorkomen en om keys altijd referentieel gelijk te houden