diff --git a/src/effect/schema/Jsonifiable.ts b/src/effect/schema/Jsonifiable.ts index d1efbbb..14603f6 100644 --- a/src/effect/schema/Jsonifiable.ts +++ b/src/effect/schema/Jsonifiable.ts @@ -12,15 +12,28 @@ import type * as TF from "type-fest" // return jsonifiable.pipe(S.compose(schema)) // } -export function Jsonifiable< - JsonifiableA extends I, +export function Jsonifiable( + schema: S.Schema +) { + return < + JsonifiableA extends I, + JsonifiableI extends TF.Jsonifiable, + JsonifiableR, + >( + jsonifiable: S.Schema + ) => + jsonifiable.pipe(S.compose(schema)) +} + +export function Jsonifiable2< + JsonifiableA, JsonifiableI extends TF.Jsonifiable, JsonifiableR, >( jsonifiable: S.Schema ) { - return ( - schema: S.Schema + return ( + schema: S.Schema ) => jsonifiable.pipe(S.compose(schema)) } diff --git a/src/effect/schema/class/MobXObservable.ts b/src/effect/schema/class/MobXObservable.ts index cc47903..f967df0 100644 --- a/src/effect/schema/class/MobXObservable.ts +++ b/src/effect/schema/class/MobXObservable.ts @@ -3,18 +3,16 @@ import { makeObservable, observable, type CreateObservableOptions } from "mobx" import { mapValues } from "remeda" -interface MobXObservableInput { +interface MobXObservableA { new(...args: any[]): S.Struct.Type readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] } } -export function MobXObservable< - This extends MobXObservableInput ->( - class_: This, +export function MobXObservable( + self: A, options?: Omit, ) { - return class MobXObservable extends class_ { + return class MobXObservable extends self { declare ["constructor"]: typeof MobXObservable constructor(...args: any[]) { @@ -25,5 +23,5 @@ export function MobXObservable< options, ) } - } as This + } as A } diff --git a/src/effect/schema/tests.ts b/src/effect/schema/tests.ts index 139187d..93e28f4 100644 --- a/src/effect/schema/tests.ts +++ b/src/effect/schema/tests.ts @@ -1,6 +1,6 @@ import { Schema as S } from "@effect/schema" import { reaction, runInAction } from "mobx" -import { Jsonifiable } from "./Jsonifiable" +import { Jsonifiable2 } from "./Jsonifiable" import { MobXObservable, MutableTaggedClass } from "./class" @@ -12,17 +12,12 @@ class User extends MutableTaggedClass()("User", { ) {} const JsonifiableUser = User.pipe( - Jsonifiable(S.Struct({ + Jsonifiable2(S.Struct({ ...User.fields, id: S.BigInt, })) ) -const JsonifiableUser2 = Jsonifiable(User)(S.Struct({ - ...User.fields, - id: S.BigInt, -})) - const user1 = new User({ id: -1n, role: "BasicUser" }) reaction(() => user1.id, id => console.log(`user1 id changed: ${ id }`))