import type { AnyDataModel } from "../dataModel/BaseDataModel";
import type { ModelClass, ModelData } 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 data model data.
 * The type referenced in the model decorator will be used for type checking.
 *
 * Example:
 * ```ts
 * const someDataModelDataType = types.dataModelData(SomeModel)
 * // or for recursive models
 * const someDataModelDataType = types.dataModelData<SomeModel>(() => SomeModel)
 * ```
 *
 * @typeparam M Data model type.
 * @param modelClass Model class.
 * @returns
 */
export declare function typesDataModelData<M = never, K = M>(modelClass: _ClassOrObject<M, K>): IdentityType<ModelData<K extends M ? (M extends AnyDataModel ? M : never) : (K extends AnyDataModel ? K : never)>>;
/**
 * `types.dataModelData` type info for a model props.
 */
export interface DataModelDataTypeInfoProps {
    readonly [propName: string]: Readonly<{
        type: AnyStandardType | undefined;
        typeInfo: TypeInfo | undefined;
        hasDefault: boolean;
        default: any;
    }>;
}
/**
 * `types.dataModelData` type info.
 */
export declare class DataModelDataTypeInfo extends TypeInfo {
    readonly modelClass: ModelClass<AnyDataModel>;
    private _props;
    get props(): DataModelDataTypeInfoProps;
    get modelType(): string;
    constructor(thisType: AnyStandardType, modelClass: ModelClass<AnyDataModel>);
}
export {};
