Built on immer, immutable recorda are class factories for immutable types.
deno add jsr:@myty/immutable-recordnpm install @myty/immutable-recordimport{ImmutableConstructor,ImmutableRecord,ImmutableWith}from"@myty/immutable-record";interfaceTestDataInterface{testNumber: number;testString: string;optionalString?: string;}constdefaultValues: TestDataInterface={testNumber: 1,testString: "test",};classTestClassextendsImmutableRecord<TestDataInterface>(defaultValues){withTestNumber(testNumber: number){returnthis.with({ testNumber });}}constvalue=newTestClass();// { testNumber: 1, testString: 'test' }constnewValue=value.with({testNumber: 2,optionalString: "test-optional"});// { testNumber: 2, testString: 'test', optionalString: 'test-optional' }interfaceTestParentClassInterface{data: TestDataInterface;}classTestParentClassextendsImmutableRecord<TestParentClassInterface>({data: newTestClass()},(values)=>{let{ data }=values;if(!(datainstanceofTestClass)){data=newTestClass(data);}return{ ...values, data };},){}constvalue=newTestParentClass({data: { testNumber, testString },});// value.data instanceof TestClass === trueconstvalue=newTestParentClass().with({data: { testNumber, testString },});// value.data instanceof TestClass === true