import type { AbstractModelClass } from "../modelShared/BaseModelShared";
import type { ModelProps, ModelPropsToData, ModelPropsToSetter } from "../modelShared/prop";
import type { AnyDataModel, BaseDataModel, BaseDataModelKeys } from "./BaseDataModel";
export declare type _ComposedData<SuperModel, TProps extends ModelProps> = SuperModel extends BaseDataModel<infer D> ? ModelPropsToData<TProps> & D : ModelPropsToData<TProps>;
export interface _DataModel<SuperModel, TProps extends ModelProps> {
    new (data: _ComposedData<SuperModel, TProps>): SuperModel & BaseDataModel<ModelPropsToData<TProps>> & Omit<ModelPropsToData<TProps>, BaseDataModelKeys> & ModelPropsToSetter<TProps>;
}
/**
 * Base abstract class for data 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.
 * @returns
 */
export declare function ExtendedDataModel<TProps extends ModelProps, TModel extends AnyDataModel, A extends []>(genFn: (...args: A) => {
    baseModel: AbstractModelClass<TModel>;
    props: TProps;
}): _DataModel<TModel, TProps>;
/**
 * Base abstract class for data models that extends another model.
 *
 * @typeparam TProps New model properties type.
 * @typeparam TModel Model type.
 * @param baseModel Base model type.
 * @param modelProps Model properties.
 * @returns
 */
export declare function ExtendedDataModel<TProps extends ModelProps, TModel extends AnyDataModel>(baseModel: AbstractModelClass<TModel>, modelProps: TProps): _DataModel<TModel, TProps>;
/**
 * Base abstract class for data models.
 *
 * Never override the constructor, use `onLazyInit` or `onLazyAttachedToRootStore` instead.
 *
 * @typeparam TProps Model properties type.
 * @param fnModelProps Function that generates model properties.
 */
export declare function DataModel<TProps extends ModelProps, A extends []>(fnModelProps: (...args: A) => TProps): _DataModel<unknown, TProps>;
/**
 * Base abstract class for data models.
 *
 * Never override the constructor, use `onLazyInit` or `onLazyAttachedToRootStore` instead.
 *
 * @typeparam TProps Model properties type.
 * @param modelProps Model properties.
 */
export declare function DataModel<TProps extends ModelProps>(modelProps: TProps): _DataModel<unknown, TProps>;
