import '../../assert/js/assert.js';
import '../../globals.js';
/**
 * Property whose value must be a number.
 *
 * @author Chris Malley (PixelZoom, Inc.)
 * @author Sam Reid (PhET Interactive Simulations)
 */
import Range, { RangeStateObject } from '../../dot/js/Range.js';
import StrictOmit from '../../phet-core/js/types/StrictOmit.js';
import { PhetioID } from '../../tandem/js/phet-io-types.js';
import IOType from '../../tandem/js/types/IOType.js';
import Property, { PropertyOptions } from './Property.js';
import { ReadOnlyPropertyState } from './ReadOnlyProperty.js';
import TRangedProperty from './TRangedProperty.js';
declare const VALID_NUMBER_TYPES: readonly ["FloatingPoint", "Integer"];
type NumberType = typeof VALID_NUMBER_TYPES[number];
export declare const DEFAULT_RANGE: Range;
type NumberPropertySelfState = {
    numberType: string;
    range: RangeStateObject;
    rangePhetioID: PhetioID | null;
};
export type NumberPropertyState = NumberPropertySelfState & ReadOnlyPropertyState<number>;
type SelfOptions = {
    numberType?: NumberType;
    range?: Range | Property<Range>;
    rangePropertyOptions?: PropertyOptions<Range>;
};
export type NumberPropertyOptions = SelfOptions & StrictOmit<PropertyOptions<number>, 'phetioValueType' | 'valueType'>;
export default class NumberProperty extends Property<number> implements TRangedProperty {
    private readonly numberType;
    private readonly validateNumberAndRangeProperty;
    readonly rangeProperty: Property<Range>;
    private readonly disposeNumberProperty;
    private readonly resetNumberProperty;
    constructor(value: number, providedOptions?: NumberPropertyOptions);
    get range(): Range;
    /**
     * Convenience function for setting the rangeProperty. Note: be careful using this function, as validation will occur
     * immediately, and if the value is outside of this new Range an error will occur. See this.setValueAndRange() for
     *  way to set both at once without assertion errors.
     */
    set range(range: Range);
    reset(): void;
    dispose(): void;
    /**
     * An atomic setting function that will set a range and a value at the same time, to make sure that validation does
     * not fail after one but has been set not the other.
     */
    setValueAndRange(value: number, range: Range): void;
    /**
     * Resets the value and range atomically.
     * If you use setValueAndRange, you'll likely need to use this instead of reset.
     */
    resetValueAndRange(): void;
    /**
     * Get parent state and append NumberProperty-specific metadata to it.
     */
    toStateObject<StateType>(): NumberPropertySelfState & ReadOnlyPropertyState<StateType>;
    static NumberPropertyIO: IOType<NumberProperty, NumberPropertyState, NumberPropertySelfState>;
}
export {};
//# sourceMappingURL=NumberProperty.d.ts.map