mobx-keystone
Version:
A MobX powered state management solution based on data trees with first class support for TypeScript, snapshots, patches and much more
48 lines (47 loc) • 2.32 kB
TypeScript
import { Frozen, frozenKey } from '../frozen/Frozen';
import { AnyModel } from '../model/BaseModel';
import { modelIdKey, modelTypeKey } from '../model/metadata';
import { ModelFromSnapshot, ModelToSnapshot } from '../modelShared/BaseModelShared';
import { ArraySet, ObjectMap } from '../wrappers';
export type SnapshotOutOfObject<T> = {
[k in keyof T]: SnapshotOutOf<T[k]> extends infer R ? R : never;
};
export type SnapshotOutOfModel<M extends AnyModel> = ModelToSnapshot<M>;
export interface SnapshotOutOfFrozen<F extends Frozen<any>> {
[frozenKey]: true;
data: F["data"];
}
export interface SnapshotOutOfObjectMap<V> {
items: {
[k: string]: SnapshotOutOf<V>;
};
[modelTypeKey]?: string;
[modelIdKey]: string;
}
export interface SnapshotOutOfArraySet<V> {
items: SnapshotOutOf<V>[];
[modelTypeKey]?: string;
[modelIdKey]: string;
}
export type SnapshotOutOf<T> = T extends ObjectMap<infer V> ? SnapshotOutOfObjectMap<V> extends infer R ? R : never : T extends ArraySet<infer V> ? SnapshotOutOfArraySet<V> extends infer R ? R : never : T extends AnyModel ? SnapshotOutOfModel<T> extends infer R ? R : never : T extends Frozen<any> ? SnapshotOutOfFrozen<T> extends infer R ? R : never : T extends object ? SnapshotOutOfObject<T> extends infer R ? R : never : T;
export type SnapshotInOfObject<T> = {
[k in keyof T]: SnapshotInOf<T[k]> extends infer R ? R : never;
};
export type SnapshotInOfModel<M extends AnyModel> = ModelFromSnapshot<M>;
export interface SnapshotInOfFrozen<F extends Frozen<any>> {
[frozenKey]: true;
data: F["data"];
}
export interface SnapshotInOfObjectMap<V> {
items?: {
[k: string]: SnapshotOutOf<V>;
};
[modelTypeKey]?: string;
[modelIdKey]: string;
}
export interface SnapshotInOfArraySet<V> {
items?: SnapshotOutOf<V>[];
[modelTypeKey]?: string;
[modelIdKey]: string;
}
export type SnapshotInOf<T> = T extends ObjectMap<infer V> ? SnapshotInOfObjectMap<V> extends infer R ? R : never : T extends ArraySet<infer V> ? SnapshotInOfArraySet<V> extends infer R ? R : never : T extends AnyModel ? SnapshotInOfModel<T> extends infer R ? R : never : T extends Frozen<any> ? SnapshotInOfFrozen<T> extends infer R ? R : never : T extends object ? SnapshotInOfObject<T> extends infer R ? R : never : T;