import { ToPrimitive } from '../interfaces/to-primitive.interface';
import { StringType } from '../types';
import { ReadonlyOrNot } from '../types/primitive.type';
import { TypedDecimal } from './numbers/typed-decimal.class';
import { TypedInt } from './numbers/typed-int.class';
import { TypedObject } from './typed-object.class';
export declare class TypedNumber<T extends number> extends TypedObject<T> implements ToPrimitive<T> {
    private readonly number;
    constructor(data?: T);
    /**
     * A function that makes it possible to narrow down the range of TypeNumber types more narrowly.
     *
     * @param format 'int' | 'decimal' | 'decimal(n,n)' | 'float'
     * @example
     * ```ts
     * TypedNumber.refine('int')(3); // only int.
     *
     * TypedNumber.refine('decimal', 1, 2)(3.14); // only decimal(1,2).
     * TypedNumber.refine('decimal')(3.14); // decimal, if is same as float.
     * TypedNumber.refine('decimal(1,2)')(3.14);
     * ```
     *
     * @todo if format is `decimal(n,n)`, integer and fractional parameter have to be empty.
     */
    static refine<Integer extends number>(format: 'int'): <N extends number>(data: StringType.IsInt<N>) => TypedInt<N>;
    static refine<Integer extends number>(format: 'float'): <N extends number>(data: StringType.IsDecimal<N, number, number>) => TypedDecimal<N, number, number>;
    static refine<Integer extends number, Fractional extends number>(format: 'decimal' | `decimal(${Integer},${Fractional})`, integer?: Integer, fractional?: Fractional): <N extends number>(data: StringType.IsDecimal<N, Integer, Fractional>) => TypedDecimal<N, Integer, Fractional>;
    toPrimitive(): T;
}
export declare namespace TypedNumber {
    type Format = 'number' | 'int' | `decimal(${number},${number})` | 'float' | `range(${number},${number})`;
    /**
     * Inference of value type.
     */
    type ValueType<Pointer extends TypedNumber<any> | number> = Pointer extends TypedNumber<infer T> ? T : Pointer extends number ? Pointer : never;
    /**
     * Inference of value types.
     */
    type ValueTypes<Pointers extends ReadonlyOrNot<(TypedNumber<any> | number)[]>> = Pointers extends [
        infer F extends TypedNumber<infer T> | number,
        ...infer Rest extends ReadonlyOrNot<(TypedNumber<any> | number)[]>
    ] ? [TypedNumber.ValueType<F>, ...TypedNumber.ValueTypes<Rest>] : [];
}
//# sourceMappingURL=typed-number.class.d.ts.map