From 7b3ed493698d8ecb56f9662e4441960d94a32cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 26 Aug 2024 02:37:10 +0200 Subject: [PATCH 1/3] ObservableClassDual --- src/Schema/MobX/ObservableClass.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Schema/MobX/ObservableClass.ts b/src/Schema/MobX/ObservableClass.ts index 3be882a..e723f12 100644 --- a/src/Schema/MobX/ObservableClass.ts +++ b/src/Schema/MobX/ObservableClass.ts @@ -24,3 +24,8 @@ export const ObservableClass = ( ) } } as Self + +export const ObservableClassDual: { + (options?: Omit): (self: Self) => Self + (self: Self, options?: Omit): Self +} = () => {} From 9ee50bfd1942647f87a0327981d8a0b52c136eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 26 Aug 2024 03:28:50 +0200 Subject: [PATCH 2/3] Changed ObservableClass API --- src/Schema/MobX/ObservableClass.ts | 31 +++++++++++++----------------- src/tests.ts | 2 +- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/Schema/MobX/ObservableClass.ts b/src/Schema/MobX/ObservableClass.ts index e723f12..61243c7 100644 --- a/src/Schema/MobX/ObservableClass.ts +++ b/src/Schema/MobX/ObservableClass.ts @@ -8,24 +8,19 @@ interface ObservableClassSelf { readonly fields: { readonly [K in keyof Schema.Struct.Fields]: Schema.Struct.Fields[K] } } -export const ObservableClass = ( - self: Self, - options?: Omit, -) => - class Observable extends self { - declare ["constructor"]: typeof Observable +interface ObservableClassOptions extends Omit {} - constructor(...args: any[]) { - super(...args) +export const ObservableClass = (options?: ObservableClassOptions) => + (self: Self) => + class Observable extends self { + declare ["constructor"]: typeof Observable - makeObservable(this, - mapValues(this.constructor.fields, () => observable), - options, - ) - } - } as Self + constructor(...args: any[]) { + super(...args) -export const ObservableClassDual: { - (options?: Omit): (self: Self) => Self - (self: Self, options?: Omit): Self -} = () => {} + makeObservable(this, + mapValues(this.constructor.fields, () => observable), + options, + ) + } + } as Self diff --git a/src/tests.ts b/src/tests.ts index f1adbc7..e23104f 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -22,7 +22,7 @@ class User extends MutableTaggedClass()("User", { id: S.BigIntFromSelf, role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), }).pipe( - ObservableClass + ObservableClass() ) {} const JsonifiableUser = User.pipe( From a6ef4defe6ba8dd641f130a68f22d5867e785b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 26 Aug 2024 03:32:51 +0200 Subject: [PATCH 3/3] Fix --- src/tests.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index e23104f..de20458 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,5 +1,5 @@ import { Schema as S } from "@effect/schema" -import { reaction, runInAction } from "mobx" +import { computed, makeObservable, reaction, runInAction } from "mobx" import type { Simplify } from "type-fest" import { MutableTaggedClass, toJsonifiable } from "./Schema" import { ObservableClass } from "./Schema/MobX" @@ -18,12 +18,24 @@ type TestB = { type Merged = Simplify> -class User extends MutableTaggedClass()("User", { + +const UserSchema = MutableTaggedClass()("User", { id: S.BigIntFromSelf, role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), }).pipe( ObservableClass() -) {} +) + +class User extends UserSchema { + constructor(...args: ConstructorParameters) { + super(...args) + makeObservable(this, { idAsString: computed }) + } + + get idAsString() { + return this.id.toString() + } +} const JsonifiableUser = User.pipe( toJsonifiable(S.Struct({