declare class ValidationError extends Error {
    readonly path: Array<string | number>;
    readonly value: unknown;
    constructor(message: string, options?: {
        path?: Array<string | number>;
        value?: unknown;
    });
}

type ErrorMessage<T> = string | ((value: unknown, context: ValidationContext) => string);
interface ValidationContext {
    path: Array<string | number>;
    errors: ValidationError[];
}
interface EnhancedValidator<T> {
    (value: unknown, context?: ValidationContext): value is T;
    withMessage(message: ErrorMessage<T>): EnhancedValidator<T>;
    optional(): EnhancedValidator<T | undefined>;
}
declare function createValidator<T>(condition: (value: unknown, context?: ValidationContext) => value is T, defaultMessage?: ErrorMessage<T>): EnhancedValidator<T>;

interface ObjectValidationSchema {
    [key: string]: ReturnType<typeof createValidator<any>>;
}
declare function validateObject<T extends object>(schema: ObjectValidationSchema): (value: unknown, context?: ValidationContext) => value is T;

declare const checkString: EnhancedValidator<string>;
declare const checkNumber: EnhancedValidator<number>;
declare const checkEmail: EnhancedValidator<string>;

declare class ValidationChain<T> {
    private value;
    private validators;
    constructor(value: unknown);
    check(validator: (value: unknown) => boolean, message?: string): this;
    validate(): T;
}
declare const chain: <T>(value: unknown) => ValidationChain<T>;

export { type EnhancedValidator, ValidationChain, type ValidationContext, ValidationError, chain, checkEmail, checkNumber, checkString, createValidator, validateObject };
