import { AbstractSchema, type ConditionalResult, type SchemaGenerics, type SchemaParams, type SerializationParams } from '../lib/schema.js';
import type { AbstractClean, ConditionalNullable, JsonSchema, Nullable, SchemaType } from '../lib/types.js';
interface LimitWithExclusive {
    value: number;
    exclusive: boolean;
}
interface NumberParams<T extends number, N extends boolean> extends SchemaParams<Nullable<T, N>> {
    type?: 'integer' | 'number';
    multipleOf?: number | number[];
    maximum?: number | LimitWithExclusive;
    minimum?: number | LimitWithExclusive;
}
interface NumberGenerics<T extends number, N extends boolean> extends SchemaGenerics<Nullable<T, N>> {
    params: NumberParams<T, N>;
}
type StripNumber<T extends number> = AbstractClean<number, T>;
type AnyNumberSchema = NumberSchema<number, boolean>;
/**
 * Schema for defining numeric types.
 *
 * Defaults to `type=number` (any valid number) but can be overwritten to `type=integer` (no fraction).
 *
 * Some `pattern` assertions are built in to help typescript, but most
 * likely end typescript result will just be `string`.
 *
 * Supports multiple `multipleOf`s.
 *
 * @template T
 * @template N
 */
export declare class NumberSchema<T extends number, N extends boolean = false> extends AbstractSchema<NumberGenerics<T, N>> {
    #private;
    protected readonly schemaType: "number" | "integer";
    allOf: <S extends NumberSchema<number, boolean>>(this: AnyNumberSchema, schema: S) => NumberSchema<NonNullable<SchemaType<S>> & T, null extends SchemaType<S> ? N : boolean>;
    anyOf: <S extends NumberSchema<number, boolean>>(this: AnyNumberSchema, schemas: S[]) => NumberSchema<NonNullable<SchemaType<S>> & T, null extends SchemaType<S> ? N : boolean>;
    if: <IfT extends number, IfN extends boolean, ThenT extends number, ElseT extends number, ThenN extends boolean = true, ElseN extends boolean = true>(this: AnyNumberSchema, schema: NumberSchema<IfT, IfN>, conditionals: ConditionalResult<NumberSchema<ThenT, ThenN>, NumberSchema<ElseT, ElseN>>) => NumberSchema<StripNumber<T & (ElseT | (IfT & ThenT))>, ConditionalNullable<N, IfN, ThenN, ElseN>>;
    not: <NotN extends boolean>(this: AnyNumberSchema, schema: NumberSchema<number, NotN>) => NotN extends true ? NumberSchema<T, boolean> : this;
    nullable: (this: AnyNumberSchema) => NumberSchema<T, boolean extends N ? boolean : true>;
    oneOf: <S extends NumberSchema<number, boolean>>(this: AnyNumberSchema, schemas: S[]) => NumberSchema<NonNullable<SchemaType<S>> & T, null extends SchemaType<S> ? N : boolean>;
    /**
     * @override
     */
    constructor(options?: NumberParams<T, N>);
    /**
     * Create a new instance of NumberSchema.
     *
     * @param [options] - optional
     * @param [options.minimum] - minimum value of number, defaults to inclusive.
     * @param [options.maximum] - maximum value of number, defaults to inclusive.
     * @param [options.multipleOf] - factors of number.
     * @param [options.title] - Add title to schema
     * @param [options.description] - Add description to schema
     * @param [options.deprecated] - flag schema as deprecated
     * @param [options.readOnly] - value should not be modified
     * @param [options.writeOnly] - value should be hidden
     * @returns new number schema
     */
    static create<T2 extends number>(this: void, options?: NumberParams<T2, false>): NumberSchema<T2>;
    /**
     * Set the `type` of the number.
     *
     * Does not alter typings.
     *
     * @see {@link https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.1.1}
     *
     * @param this - this instance
     * @param type - `integer` or `number`
     * @returns cloned schema
     */
    type(this: this, type: 'integer' | 'number'): this;
    /**
     * Set the `multipleOf` of the number.
     *
     * Does not alter typings.
     *
     * @see {@link https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1}
     *
     * @param this - this instance
     * @param multipleOf - multiple of property
     * @returns cloned schema
     */
    multipleOf(this: this, multipleOf: number): this;
    /**
     * Set the `maximum` of the number.
     * Optionally provide `exclusive` (default=false).
     * Set to `Infinity` to effectively clear restriction.
     *
     * Does not alter typings.
     * Overwrites existing restriction.
     *
     * @see {@link https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.2}
     *
     * @param this - this instance
     * @param maximum - maximum property
     * @returns cloned schema
     */
    maximum(this: this, maximum: number | LimitWithExclusive): this;
    /**
     * Set the `exclusiveMaximum` of the number.
     * Convenience method around `maximum` with `exclusive=true`.
     *
     * Does not alter typings.
     * Overwrites existing restriction.
     *
     * @see {@link https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.3}
     *
     * @param this - this instance
     * @param exclusiveMaximum - exclusive maximum property
     * @returns cloned schema
     */
    exclusiveMaximum(this: this, exclusiveMaximum: number): this;
    /**
     * Set the `minimum` of the number.
     * Optionally provide `exclusive` (default=false).
     * Set to `-Infinity` to effectively clear restriction.
     *
     * Does not alter typings.
     * Overwrites existing restriction.
     *
     * @see {@link https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.4}
     *
     * @param this - this instance
     * @param minimum - minimum property
     * @returns cloned schema
     */
    minimum(this: this, minimum: number | LimitWithExclusive): this;
    /**
     * Set the `exclusiveMinimum` of the number.
     * Convenience method around `minimum` with `exclusive=true`.
     *
     * Does not alter typings.
     * Overwrites existing restriction.
     *
     * @see {@link https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.5}
     *
     * @param this - this instance
     * @param exclusiveMinimum - exclusive minimum property
     * @returns cloned schema
     */
    exclusiveMinimum(this: this, exclusiveMinimum: number): this;
    /**
     * @override
     */
    protected getCloneParams(): Required<NumberParams<T, N>>;
    /**
     * @override
     */
    protected static getDefaultValues(params: SerializationParams): Record<string, unknown>;
    /**
     * @override
     */
    protected toSchema(params: SerializationParams): JsonSchema<SchemaType<this>>;
}
export {};
//# sourceMappingURL=number.d.ts.map