import type { AnyModel } from "../model/BaseModel";
import type { ModelClass } from "../modelShared/BaseModelShared";
import type { AnyStandardType, IdentityType } from "./schemas";
import { TypeInfo } from "./TypeChecker";
declare type _Class<T> = abstract new (...args: any[]) => T;
declare type _ClassOrObject<M, K> = K extends M ? object : _Class<K> | (() => _Class<K>);
/**
 * A type that represents a model. The type referenced in the model decorator will be used for type checking.
 *
 * Example:
 * ```ts
 * const someModelType = types.model(SomeModel)
 * // or for recursive models
 * const someModelType = types.model<SomeModel>(() => SomeModel)
 * ```
 *
 * @typeparam M Model type.
 * @param modelClass Model class.
 * @returns
 */
export declare function typesModel<M = never, K = M>(modelClass: _ClassOrObject<M, K>): IdentityType<K extends M ? M : K>;
/**
 * `types.model` type info for a model props.
 */
export interface ModelTypeInfoProps {
    readonly [propName: string]: Readonly<{
        type: AnyStandardType | undefined;
        typeInfo: TypeInfo | undefined;
        hasDefault: boolean;
        default: any;
    }>;
}
/**
 * `types.model` type info.
 */
export declare class ModelTypeInfo extends TypeInfo {
    readonly modelClass: ModelClass<AnyModel>;
    private _props;
    get props(): ModelTypeInfoProps;
    get modelType(): string;
    constructor(thisType: AnyStandardType, modelClass: ModelClass<AnyModel>);
}
export {};
