mutative
mutative copied to clipboard
Is it possible to use class instances with create?
Feeding class instances to create function causes the following Error, unless they are wrapped with a primitive like it's done in the class benchmark example.
Error: Invalid base state: create() only supports plain objects, arrays, Set, Map or using mark() to mark the state as immutable
Is this by design? What is the recommended usage pattern for mutating class instances?
As mentioned in the error message, you can use the mark option function to mark immutable class instances. For example,
class Foobar {
foo = {
bar: 'str',
};
change() {
this.foo.bar = 'new str';
}
}
const data = {
foo: {
bar: 'str',
},
foobar: new Foobar(),
};
const state = create(
data,
(draft) => {
draft.foo.bar = 'new str';
draft.foobar.change();
},
{
mark: (target, { immutable }) => {
if (target instanceof Foobar) return immutable;
},
}
);
const foobar = new Foobar();
foobar.foo.bar = 'new str';
expect(state).toEqual({ foo: { bar: 'new str' }, foobar });
expect(state).not.toBe(data);
expect(state.foo).not.toBe(data.foo);
expect(state.foobar).not.toBe(data.foobar);
expect(state.foobar.foo).not.toBe(data.foobar.foo);