Helpers for handling immutable objects with typescript
Replicator is a tool to replicate and modify immutable objects.
return ReplicationBuilder.forObject(state).property('party').replaceValueOf('name').with('MyParty').build()
return ReplicationBuilder.forObject(state).property('party').replaceValueOf('partymemberArray').by((oldPartymemberArray) => [...oldPartymemberArray, 'new partymember']).build()
return ReplicationBuilder.forObject(state).replaceValueOf('party').withCloneAndDo((clonedParty) => clonedParty.addPartyMember('new partymember')).build()
return ReplicationBuilder.forObject(state)
.property('party').replaceValueOf('name').with('MyParty').replaceValueOf('members').by((members) => [...members, newMember])
.property('initiator').replaceValueOf('prename').with('Party').replaceValueOf('surname').with('guy')
.build();
- Load an object by calling
ReplicationBuilder.forObject()
- Navigate down the object tree through the typesafe function
property()
- Modify a property with either (see syntax paragraph above)
replaceValueOf('prop').with(newValue:T)
replaceValueOf('prop').by((T) => newValue:T)
replaceValueOf('prop').withCloneAndDo((clonedProp) => clonedProp.doSomething()
removeProperty('prop')
to remove the property in the resulting object
- Repeat step 3 and 4 until all modifications are done
- Produce the replica with
build()
- deep copies the source object
- freeze in --> freeze out. If the source object was frozen (for detecting manipulations while development), then the produced replica will also be deep frozen.
- warning if source object is not deep frozen (produced replica will be deep frozen)
DeepFreeze freezes an object recursively and the developer is pointed to illegal state manipulations by errors in the javascript console.
deepFreeze()
applies Object.freeze() recursively on an object to make it immutable
isDeepFrozen()
checks if an object is recursively frozen.
export class StoreModule {
constructor(/* ... */) {
/* ... */
const rootState = isDevMode()? deepFreeze(INITIAL_ROOTSTATE) : INITIAL_ROOTSTATE
store.configureStore(
rootReducer,
rootState,
middlewares,
storeEnhancer
)
}
}
If the state is initially frozen and you are using the Replicator for handling the updates, the state will get frozen again by the replicator.