0.1.6 (#7)
Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: #7
This commit was merged in pull request #7.
This commit is contained in:
26
src/Schema/MobX/ObservableClass.ts
Normal file
26
src/Schema/MobX/ObservableClass.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
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] }
|
||||
}
|
||||
|
||||
export const ObservableClass = <Self extends ObservableClassSelf>(
|
||||
self: Self,
|
||||
options?: Omit<CreateObservableOptions, "proxy">,
|
||||
) =>
|
||||
class Observable extends self {
|
||||
declare ["constructor"]: typeof Observable
|
||||
|
||||
constructor(...args: any[]) {
|
||||
super(...args)
|
||||
|
||||
makeObservable(this,
|
||||
mapValues(this.constructor.fields, () => observable),
|
||||
options,
|
||||
)
|
||||
}
|
||||
} as Self
|
||||
Reference in New Issue
Block a user