Skip to content

The sole purpose of this immutable record is to simply act as a class factory for immutable types. For this implementation, it piggybacks off immer and adds a 'with' method to the record class.

License

Notifications You must be signed in to change notification settings

myty/immutable-record

Repository files navigation

Introduction

Built on immer, immutable recorda are class factories for immutable types.

Deno

deno add jsr:@myty/immutable-record

Node

npm install @myty/immutable-record

Usage

import { ImmutableConstructor, ImmutableRecord, ImmutableWith } from "@myty/immutable-record";

interface TestDataInterface {
  testNumber: number;
  testString: string;
  optionalString?: string;
}

const defaultValues: TestDataInterface = {
  testNumber: 1,
  testString: "test",
};

class TestClass extends ImmutableRecord<TestDataInterface>(defaultValues) {
  withTestNumber(testNumber: number) {
    return this.with({ testNumber });
  }
}

const value = new TestClass();
// { testNumber: 1, testString: 'test' }

const newValue = value.with({ testNumber: 2, optionalString: "test-optional" });
// { testNumber: 2, testString: 'test', optionalString: 'test-optional' }

Processing Nested Classes

interface TestParentClassInterface {
  data: TestDataInterface;
}

class TestParentClass extends ImmutableRecord<TestParentClassInterface>(
  { data: new TestClass() },
  (values) => {
    let { data } = values;

    if (!(data instanceof TestClass)) {
      data = new TestClass(data);
    }

    return { ...values, data };
  },
) {}

const value = new TestParentClass({
  data: { testNumber, testString },
});
// value.data instanceof TestClass === true

const value = new TestParentClass().with({
  data: { testNumber, testString },
});
// value.data instanceof TestClass === true

About

The sole purpose of this immutable record is to simply act as a class factory for immutable types. For this implementation, it piggybacks off immer and adds a 'with' method to the record class.

Topics

Resources

License

Stars

Watchers

Forks