import * as Joi from 'joi';
import { Schema } from './validator.schema';
export declare type ExtractedBody<T extends Schema> = ExtractObject<T['body']>;
export declare type ExtractedParams<T extends Schema> = ExtractObject<T['params']>;
export declare type ExtractedQuery<T extends Schema> = ExtractObject<T['query']>;
export declare type ExtractObject<T> = T extends Joi.ObjectSchema ? ExtractType<T> : {
    [K in keyof T]: ExtractType<T[K]>;
};
export declare type ExtractType<T> = T extends Joi.NumberSchema ? number : T extends Joi.BooleanSchema ? boolean : T extends Joi.StringSchema ? string : T extends Joi.DateSchema ? Date : T extends Joi.ObjectSchema<infer U> ? U extends null ? Record<string, any> : {
    [K in keyof U]: ExtractType<U[K]>;
} : T extends Joi.ArraySchema<infer U> ? U extends null ? any[] : U[] : unknown;
declare module 'joi' {
    function object<T>(schema: T): ObjectSchema<T>;
    interface ObjectSchema<T = null> {
        keys<T>(schema: T): ObjectSchema<ExtractType<T>>;
    }
    function array<T>(schema: T): ArraySchema<ExtractType<T>>;
    interface ArraySchema<T = null> {
        items<T>(schema: T): ArraySchema<ExtractType<T>>;
    }
}
//# sourceMappingURL=validator.interface.d.ts.map