import { ModuleType } from '../type/classes/ModuleType';
import { Value } from './Value';
import { FnValue } from './FnValue';
import type { Printable } from 'tree-dump/lib/types';
import type * as classes from '../type';
import type { TypeBuilder } from '../type/TypeBuilder';
export type UnObjType<T> = T extends classes.ObjType<infer U> ? U : never;
export type UnObjValue<T> = T extends ObjValue<infer U> ? U : never;
export type UnObjFieldTypeVal<T> = T extends classes.KeyType<any, infer U> ? U : never;
export type ObjFieldToTuple<F> = F extends classes.KeyType<infer K, infer V> ? [K, V] : never;
export type ToObject<T> = T extends [string, unknown][] ? {
    [K in T[number] as K[0]]: K[1];
} : never;
export type ObjValueToTypeMap<F> = ToObject<{
    [K in keyof F]: ObjFieldToTuple<F[K]>;
}>;
export type Ensure<T, X> = T extends X ? T : X;
export declare class ObjValue<T extends classes.ObjType<any>> extends Value<T> implements Printable {
    static new: (system?: ModuleType) => ObjValue<classes.ObjType<[]>>;
    get system(): classes.ModuleType;
    get t(): TypeBuilder;
    keys(): string[];
    get<K extends keyof ObjValueToTypeMap<UnObjType<T>>>(key: K): Value<ObjValueToTypeMap<UnObjType<T>>[K] extends classes.Type ? ObjValueToTypeMap<UnObjType<T>>[K] : classes.Type>;
    fn<K extends keyof ObjValueToTypeMap<UnObjType<T>>>(key: K): FnValue<Ensure<ObjValueToTypeMap<UnObjType<T>>[K] extends classes.Type ? ObjValueToTypeMap<UnObjType<T>>[K] : classes.Type, classes.FnType<any, any, any>>>;
    field<F extends classes.KeyType<any, any>>(field: F | ((t: TypeBuilder) => F), data: classes.ResolveType<UnObjFieldTypeVal<F>>): ObjValue<classes.ObjType<[...UnObjType<T>, F]>>;
    add<K extends string, V extends classes.Type>(key: K, type: V | ((t: TypeBuilder) => V), data: classes.ResolveType<V>): ObjValue<classes.ObjType<[...UnObjType<T>, classes.KeyType<K, V>]>>;
    set<K extends string, V extends classes.Type>(key: K, value: Value<V>): ObjValue<classes.ObjType<[...UnObjType<T>, classes.KeyType<K, V>]>>;
    merge<O extends ObjValue<any>>(obj: O): ObjValue<classes.ObjType<[...UnObjType<T>, ...UnObjType<O['type']>]>>;
    name(): string;
}
//# sourceMappingURL=ObjValue.d.ts.map