UNPKG

mobx-keystone-mindreframer

Version:

A MobX powered state management solution based on data trees with first class support for Typescript, snapshots, patches and much more

76 lines (75 loc) 3.64 kB
import type { AbstractModelClass } from "../modelShared/BaseModelShared"; import { idProp, ModelProps, ModelPropsToCreationData, ModelPropsToData, ModelPropsToSetter } from "../modelShared/prop"; import type { AnyModel, BaseModel, BaseModelKeys, ModelIdPropertyName } from "./BaseModel"; export declare type _ComposedCreationData<SuperModel, TProps extends ModelProps> = SuperModel extends BaseModel<any, infer CD, any> ? ModelPropsToCreationData<TProps> & CD : ModelPropsToCreationData<TProps>; export declare type _ModelId<SuperModel, TProps extends ModelProps> = SuperModel extends AnyModel ? ModelIdPropertyName<SuperModel> : ExtractModelIdProp<TProps> & string; export interface _Model<SuperModel, TProps extends ModelProps> { new (data: _ComposedCreationData<SuperModel, TProps>): SuperModel & BaseModel<ModelPropsToData<TProps>, ModelPropsToCreationData<TProps>, _ModelId<SuperModel, TProps>> & Omit<ModelPropsToData<TProps>, BaseModelKeys> & ModelPropsToSetter<TProps>; } /** * @ignore * Ensures that a $modelId property is present if no idProp is provided. */ export declare type AddModelIdPropIfNeeded<TProps extends ModelProps> = ExtractModelIdProp<TProps> extends never ? TProps & { $modelId: typeof idProp; } : TProps; /** * Extract the model id property from the model props. */ export declare type ExtractModelIdProp<TProps extends ModelProps> = { [K in keyof TProps]: TProps[K]["$isId"] extends true ? K : never; }[keyof TProps]; /** * Base abstract class for models that extends another model. * * @typeparam TProps New model properties type. * @typeparam TModel Model type. * @param genFn Function that returns the base model and model properties. * @param modelOptions Model options. * @returns */ export declare function ExtendedModel<TProps extends ModelProps, TModel extends AnyModel, A extends []>(genFn: (...args: A) => { baseModel: AbstractModelClass<TModel>; props: TProps; }, modelOptions?: ModelOptions): _Model<TModel, TProps>; /** * Base abstract class for models that extends another model. * * @typeparam TProps New model properties type. * @typeparam TModel Model type. * @param baseModel Base model type. * @param modelProps Model properties. * @param modelOptions Model options. * @returns */ export declare function ExtendedModel<TProps extends ModelProps, TModel extends AnyModel>(baseModel: AbstractModelClass<TModel>, modelProps: TProps, modelOptions?: ModelOptions): _Model<TModel, TProps>; /** * Base abstract class for models. * * Never override the constructor, use `onInit` or `onAttachedToRootStore` instead. * * @typeparam TProps Model properties type. * @param fnModelProps Function that generates model properties. * @param modelOptions Model options. */ export declare function Model<TProps extends ModelProps, A extends []>(fnModelProps: (...args: A) => TProps, modelOptions?: ModelOptions): _Model<unknown, AddModelIdPropIfNeeded<TProps>>; /** * Base abstract class for models. * * Never override the constructor, use `onInit` or `onAttachedToRootStore` instead. * * @typeparam TProps Model properties type. * @param modelProps Model properties. * @param modelOptions Model options. */ export declare function Model<TProps extends ModelProps>(modelProps: TProps, modelOptions?: ModelOptions): _Model<unknown, AddModelIdPropIfNeeded<TProps>>; /** * Model options. */ export interface ModelOptions { /** * A value type will be cloned automatically when being attached to a new tree. * The default is `false`. */ valueType?: boolean; }