import '../../assert/js/assert.js';
import '../../tandem/js/PhetioIDUtils.js';
import '../../globals.js';
import IntentionalAny from '../../phet-core/js/types/IntentionalAny.js';
import KeysMatching from '../../phet-core/js/types/KeysMatching.js';
import KeysNotMatching from '../../phet-core/js/types/KeysNotMatching.js';
import DerivedStringProperty, { DerivedStringPropertyOptions } from './DerivedStringProperty.js';
import TCollapsePropertyValue from './TCollapsePropertyValue.js';
import TReadOnlyProperty from './TReadOnlyProperty.js';
type ValuesType = Record<string, IntentionalAny>;
type StringNumberOrProperty = string | number | TReadOnlyProperty<string> | TReadOnlyProperty<number> | TReadOnlyProperty<string | number>;
type MapsType<Values extends ValuesType> = {
    [Key in KeysMatching<Values, StringNumberOrProperty>]?: (value: TCollapsePropertyValue<Values[Key]>) => string | number;
} & {
    [Key in KeysNotMatching<Values, StringNumberOrProperty>]: (value: TCollapsePropertyValue<Values[Key]>) => string | number;
};
type OptionalSelfOptions<Values extends ValuesType> = {
    /**
     * Rounds numeric values to a given number of decimal places if provided. If a number is given, it will apply to
     * ALL numeric values (of type 'number'). A record can also be provided that provides decimalPlaces for specific
     * values.
     *
     * For example:
     * | const stringProperty = new TinyProperty( 'Test: {{value}}' );
     * | const valueProperty = new TinyProperty( 5.12345 );
     * | new PatternStringProperty( stringProperty, { value: valueProperty }, { decimalPlaces: 2 } )
     * will take the value 'Test: 5.12'.
     *
     * Multiple decimal places example:
     * | const stringProperty = new TinyProperty( 'There are {{squirrels}} million squirrels who eat more than {{acorns}} acorns a day' );
     * | const squirrelsProperty = new TinyProperty( 5.12345 );
     * | const acornsProperty = new TinyProperty( 20.254 );
     * | new PatternStringProperty( stringProperty, {
     * |   squirrels: squirrelsProperty,
     * |   acorns: acornsProperty
     * | }, {
     * |   decimalPlaces: {
     * |     squirrels: 0,
     * |     acorns: 2
     * |   }
     * | } )
     *
     * NOTE: Provide null if decimal places should not be used for a given value
     */
    decimalPlaces?: number | null | Record<keyof Values, number | null>;
    /**
     * @deprecated - only used for converting vestigial usages of StringUtils.format
     *
     * For handling pattern strings from StringUtils.format, which will turn {0} => {{formatName[ 0 ]}},
     * {1} => {{formatName[ 1 ]}}, etc.
     *
     * For example:
     * | const stringProperty = new TinyProperty( 'Test: {0}' );
     * | const valueProperty = new TinyProperty( 5 );
     * | new PatternStringProperty( stringProperty, { value: valueProperty }, { formatNames: [ 'value' ] } );
     * Will effectively replace {0} in the pattern to {{value}}, which will then be used as normal
     */
    formatNames?: string[];
};
type SelfOptions<Values extends ValuesType> = OptionalSelfOptions<Values> & (KeysNotMatching<Values, StringNumberOrProperty> extends never ? {
    maps?: MapsType<Values>;
} : {
    maps: MapsType<Values>;
});
type SuperOptions = DerivedStringPropertyOptions<string>;
export type PatternStringPropertyOptions<Values extends ValuesType> = SelfOptions<Values> & SuperOptions;
export default class PatternStringProperty<Values extends ValuesType> extends DerivedStringProperty<string, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown> {
    constructor(patternProperty: TReadOnlyProperty<string>, values: Values, providedOptions?: PatternStringPropertyOptions<Values>);
}
export {};
//# sourceMappingURL=PatternStringProperty.d.ts.map