import { DefaultResult, DeprecatedResult, ExpectedResult, ForwardResult, OptionValue, RedirectResult, Utils, ValidateResult } from './types.js';
export interface SchemaParameters<$Value> extends SchemaHandlers<$Value> {
    name: string;
}
export interface SchemaHandlers<$Value> {
    default?: DefaultResult<$Value> | ((schema: Schema<$Value>, utils: Utils) => DefaultResult<$Value>);
    expected?: ExpectedResult | ((schema: Schema<$Value>, utils: Utils) => ExpectedResult);
    validate?: ValidateResult | ((value: unknown, schema: Schema<$Value>, utils: Utils) => ValidateResult);
    deprecated?: DeprecatedResult<$Value> | ((value: $Value, schema: Schema<$Value>, utils: Utils) => DeprecatedResult<$Value>);
    forward?: ForwardResult<$Value> | ((value: $Value, schema: Schema<$Value>, utils: Utils) => ForwardResult<$Value>);
    redirect?: RedirectResult<$Value> | ((value: $Value, schema: Schema<$Value>, utils: Utils) => RedirectResult<$Value>);
    overlap?: (currentValue: $Value, newValue: $Value, schema: Schema<$Value>, utils: Utils) => $Value;
    preprocess?: (value: unknown, schema: Schema<$Value>, utils: Utils) => unknown;
    postprocess?: (value: $Value, schema: Schema<$Value>, utils: Utils) => unknown;
}
export declare function createSchema<$Schema extends Schema<any>, $Parameters extends $Schema['_parametersType']>(SchemaConstructor: new (parameters: $Parameters) => $Schema, parameters: $Parameters): $Schema;
export declare abstract class Schema<$Value extends OptionValue, $Parameters extends SchemaHandlers<$Value> = SchemaHandlers<$Value>> {
    static create<$Schema extends Schema<any>>(parameters: $Schema['_parametersType']): $Schema;
    name: string;
    _valueType: $Value;
    _parametersType: $Parameters;
    constructor(parameters: SchemaParameters<$Value>);
    default(_utils: Utils): DefaultResult<$Value>;
    expected(_utils: Utils): ExpectedResult;
    validate(_value: unknown, _utils: Utils): ValidateResult;
    deprecated(_value: $Value, _utils: Utils): DeprecatedResult<$Value>;
    forward(_value: $Value, _utils: Utils): ForwardResult<$Value>;
    redirect(_value: $Value, _utils: Utils): RedirectResult<$Value>;
    overlap(currentValue: $Value, _newValue: $Value, _utils: Utils): $Value;
    preprocess(value: unknown, _utils: Utils): any;
    postprocess(_value: $Value, _utils: Utils): any;
}
