import { ValidatorResult } from "../results";
import { ValidatorItem } from "./validator-item";
import { BatchValidatorResultInfo, ExtractNonPrimitiveKeys, NestedType, ValidatorConfig, ValidatorOptions, ValidatorResultInfo } from "../utils";
type ValidatorItemsType<T extends Record<string, any>> = {
    [K in keyof T]?: ValidatorItem<T[K], T>;
};
type ValidatorStatus<T extends Record<string, any>> = {
    field?: Extract<ExtractNonPrimitiveKeys<T>, string>;
    valid?: boolean;
    message?: string;
};
export declare class Validator<T extends Record<string, any>, TContext extends Record<string, any> = any> {
    #private;
    context?: TContext;
    onChangeEvent?: (obj: T) => void;
    status: ValidatorStatus<T>;
    config(config: ValidatorConfig<T, TContext>): this;
    get nested(): NestedType<T, TContext>;
    get items(): ValidatorItemsType<T>;
    options(value: ValidatorOptions): this;
    allGood(): boolean;
    applyAll(): void;
    applyAllAsync(): Promise<void>;
    reset(): void;
    init(getter: () => T): this;
    withContext(context: TContext): this;
    private generateErrorsAsObject;
    private generateErrorsAsArray;
    private generateErrors;
    validate(data?: T): boolean;
    validateAsync(data?: T): Promise<boolean>;
    validateInfo(data?: T): ValidatorResultInfo;
    validateInfoAsync(data?: T): Promise<ValidatorResultInfo>;
    validateThrow(data?: T): void;
    validateThrowAsync(data?: T): Promise<void>;
    batchValidate(...data: T[]): BatchValidatorResultInfo;
    batchValidateAsync(...data: T[]): Promise<BatchValidatorResultInfo>;
    batchValidateThrow(...data: T[]): void;
    batchValidateThrowAsync(...data: T[]): Promise<void>;
    import(results: ValidatorResult): void;
    onChange(event: (obj: T) => void): this;
    validateItem(key: keyof T): void;
    isItemValid(key: keyof T): boolean | undefined;
    itemMessage(key: keyof T): string | undefined;
}
export {};
