import type { AnyStandardType, AnyType, ObjectType, ObjectTypeFunction } from "./schemas";
import { TypeInfo } from "./TypeChecker";
/**
 * A type that represents a plain object.
 * Note that the parameter must be a function that returns an object. This is done so objects can support self / cross types.
 *
 * Example:
 * ```ts
 * // notice the ({ ... }), not just { ... }
 * const pointType = types.object(() => ({
 *   x: types.number,
 *   y: types.number
 * }))
 * ```
 *
 * @typeparam T Type.
 * @param objectFunction Function that generates an object with types.
 * @returns
 */
export declare function typesObject<T>(objectFunction: T): T;
/**
 * `types.object` type info for an object props.
 */
export interface ObjectTypeInfoProps {
    readonly [propName: string]: Readonly<{
        type: AnyStandardType;
        typeInfo: TypeInfo;
    }>;
}
/**
 * `types.object` type info.
 */
export declare class ObjectTypeInfo extends TypeInfo {
    private _objTypeFn;
    private _props;
    get props(): ObjectTypeInfoProps;
    constructor(thisType: AnyStandardType, _objTypeFn: ObjectTypeFunction);
}
/**
 * A type that represents frozen data.
 *
 * Example:
 * ```ts
 * const frozenNumberType = types.frozen(types.number)
 * const frozenAnyType = types.frozen(types.unchecked<any>())
 * const frozenNumberArrayType = types.frozen(types.array(types.number))
 * const frozenUncheckedNumberArrayType = types.frozen(types.unchecked<number[]>())
 * ```
 *
 * @typeParam T Type.
 * @param dataType Type of the frozen data.
 * @returns
 */
export declare function typesFrozen<T extends AnyType>(dataType: T): ObjectType<{
    data: T;
}>;
/**
 * `types.frozen` type info.
 */
export declare class FrozenTypeInfo extends TypeInfo {
    readonly dataType: AnyStandardType;
    get dataTypeInfo(): TypeInfo;
    constructor(thisType: AnyStandardType, dataType: AnyStandardType);
}
