import '../../globals.js';
import OptionalKeys from './types/OptionalKeys.js';
import RequiredKeys from './types/RequiredKeys.js';
type Options<T> = Pick<T, OptionalKeys<T>>;
type ObjectWithNoKeys = Record<string | number, never>;
export type EmptySelfOptions = {
    _emptySelfOptionsKey?: never;
};
type EmptySelfOptionsKeys = keyof EmptySelfOptions;
type OptionizeDefaults<SelfOptions = EmptySelfOptions, ParentOptions = EmptySelfOptions, ProvidedOptions = EmptySelfOptions> = Omit<Required<Options<SelfOptions>>, EmptySelfOptionsKeys> & // eslint-disable-line @typescript-eslint/no-restricted-types
Partial<Record<RequiredKeys<ProvidedOptions>, never>> & Partial<ParentOptions> & Required<Omit<Pick<ParentOptions, RequiredKeys<ParentOptions>>, RequiredKeys<ProvidedOptions>>>;
export default function optionize<ProvidedOptions, SelfOptions = ProvidedOptions, // By default, every optional option in the ProvidedOptions must have a default unless you specify another object for SelfOptions
ParentOptions = Record<never, never>>(): <KeysUsedInSubclassConstructor extends keyof (ParentOptions)>(defaults: OptionizeDefaults<SelfOptions, ParentOptions, ProvidedOptions>, providedOptions: ProvidedOptions | undefined) => OptionizeDefaults<SelfOptions, ParentOptions> & ProvidedOptions & Required<Pick<ParentOptions, KeysUsedInSubclassConstructor>>;
export declare function optionize3<ProvidedOptions, SelfOptions = ProvidedOptions, // By default, every optional option in the ProvidedOptions must have a default unless you specify another object for SelfOptions
ParentOptions = Record<never, never>>(): <KeysUsedInSubclassConstructor extends keyof (ParentOptions)>(emptyObject: ObjectWithNoKeys, defaults: OptionizeDefaults<SelfOptions, ParentOptions>, providedOptions: ProvidedOptions | undefined) => OptionizeDefaults<SelfOptions, ParentOptions> & ProvidedOptions & Required<Pick<ParentOptions, KeysUsedInSubclassConstructor>>;
/**
 * Use this function to replace merge in cases like:
 *
 * const options = m-e-r-g-e(
 *   {},
 *
 *   // ParentOptions defaults that are common throughout the sim
 *   MyConstants.SOME_COMMON_OPTIONS,
 *
 *   // SelfOptions and ParentOptions defaults that are provided by this class
 *   { ... },
 *
 *   // option values that are provided by the caller
 *   providedOptions );
 */
export declare function optionize4<ProvidedOptions, SelfOptions = ProvidedOptions, ParentOptions = object>(): <KeysUsedInSubclassConstructor extends keyof (ParentOptions)>(emptyObject: ObjectWithNoKeys, optionsFromConstant: Partial<ParentOptions>, defaults2: OptionizeDefaults<SelfOptions, ParentOptions>, providedOptions: ProvidedOptions | undefined) => OptionizeDefaults<SelfOptions, ParentOptions> & ProvidedOptions & Required<Pick<ParentOptions, KeysUsedInSubclassConstructor>>;
export declare function combineOptions<Type extends object>(target: Partial<Type>, ...sources: Array<Partial<Type> | undefined>): Type;
export type { OptionizeDefaults };
//# sourceMappingURL=optionize.d.ts.map