Files
thilalib/src/Schema/MobX/ObservableClass.ts
Julien Valverdé 9ee50bfd19
All checks were successful
Lint / lint (push) Successful in 11s
Changed ObservableClass API
2024-08-26 03:28:50 +02:00

27 lines
918 B
TypeScript

import { Schema } from "@effect/schema"
import { makeObservable, observable, type CreateObservableOptions } from "mobx"
import { mapValues } from "remeda"
interface ObservableClassSelf {
new(...args: any[]): Schema.Struct.Type<Schema.Struct.Fields>
readonly fields: { readonly [K in keyof Schema.Struct.Fields]: Schema.Struct.Fields[K] }
}
interface ObservableClassOptions extends Omit<CreateObservableOptions, "proxy"> {}
export const ObservableClass = (options?: ObservableClassOptions) =>
<Self extends ObservableClassSelf>(self: Self) =>
class Observable extends self {
declare ["constructor"]: typeof Observable
constructor(...args: any[]) {
super(...args)
makeObservable(this,
mapValues(this.constructor.fields, () => observable),
options,
)
}
} as Self