diff --git a/src/Schema/MobX/ObservableClass.ts b/src/Schema/MobX/ObservableClass.ts index 3be882a..61243c7 100644 --- a/src/Schema/MobX/ObservableClass.ts +++ b/src/Schema/MobX/ObservableClass.ts @@ -8,19 +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) + + makeObservable(this, + mapValues(this.constructor.fields, () => observable), + options, + ) + } + } as Self diff --git a/src/tests.ts b/src/tests.ts index f1adbc7..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 -) {} + 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({