import { type $defaultValue, type $members, type AnyObject, type Enum, type Extensions, type TargetModel, Model, type ModelConverter, type Value } from './Model.js';
export type PrimitiveModel<V = unknown> = Model<V>;
export declare const PrimitiveModel: Model<unknown>;
export type StringModel = PrimitiveModel<string>;
export declare const StringModel: Model<string>;
export type NumberModel = PrimitiveModel<number>;
export declare const NumberModel: Model<number>;
export type BooleanModel = PrimitiveModel<boolean>;
export declare const BooleanModel: Model<boolean>;
export declare const $itemModel: unique symbol;
export type ArrayModel<M extends Model = Model> = Model<Array<Value<M>>, {
    readonly [$itemModel]: M;
}>;
export declare const ArrayModel: ArrayModel;
export type ObjectModel<V, EX extends AnyObject = AnyObject> = Model<V, {
    readonly [K in keyof EX]: EX[K] extends ModelConverter ? TargetModel<EX[K], ObjectModel<V, EX>> : EX[K];
}>;
export declare const ObjectModel: Model<Readonly<Record<never, never>>>;
export type RecordModel<K extends string, V> = Model<Record<K, V>>;
export declare const RecordModel: Model<Record<string, unknown>>;
export declare const $enum: unique symbol;
export type EnumModel<T extends typeof Enum> = Model<T[keyof T], {
    readonly [$enum]: T;
}>;
export declare const EnumModel: EnumModel<typeof Enum>;
export type UnionModel<MM extends Model[]> = Model<Value<MM[number]>, {
    readonly [$members]: MM;
}>;
export type OptionalModel<M extends Model> = Model<M[typeof $defaultValue] | undefined, Extensions<M> & {
    readonly $optional: true;
}>;
