import { AnyObject, ObjectIterator, PropertyName } from "../types/global.cjs";

//#region src/modules/object.d.ts
/**
 *  从obj中选取属性，返回一个新的对象
 * @param obj - 源对象
 * @param keys - 要选取的属性键数组
 * @returns - 包含选取属性的新对象
 * @public
 */
declare function pick<T extends object, K extends keyof T>(obj: T | undefined | null, keys: K[]): Pick<T, K>;
/**
 * 类似于数组的filter方法，但是作用于对象。
 * 默认情况下predicate，是判断value值是否为真值进行筛选
 * @param obj - 源对象
 * @param predicate - 筛选函数
 * @returns - 筛选后的新对象
 * @public
 */
declare function pickBy<T extends object, K extends keyof T>(obj: T | undefined | null, predicate?: (value: T[K], key?: K) => boolean): Partial<Pick<T, K>>;
/**
 * 从obj中剔除属性，返回一个新的对象
 * @param obj - 源对象
 * @param keys - 要剔除的属性键数组
 * @returns - 剔除指定属性后的新对象
 * @public
 */
declare function omit<T extends object, K extends keyof T>(obj: T | null | undefined, keys?: K[]): Omit<T, K>;
/**
 * pickBy的反向，判断剔除的属性
 * @param obj - 源对象
 * @param predicate - 筛选函数
 * @returns - 剔除匹配属性后的新对象
 * @public
 */
declare function omitBy<T extends object, K extends keyof T>(obj: T | undefined | null, predicate?: (value: T[K], key?: K) => boolean): Partial<Pick<T, K>>;
/**
 * 转换对象的键名
 * @param obj - 源对象
 * @param iteratee - 键名转换函数
 * @returns 转换键名后的新对象
 * @public
 */
declare function mapKeys<T extends object>(obj: T, iteratee: ObjectIterator<T, string>): Record<string, T[keyof T]>;
/**
 * 转换对象的值
 * @param obj - 源对象
 * @param iteratee - 值转换函数
 * @returns 转换值后的新对象
 * @public
 */
declare function mapValues<T extends object, U = any>(obj: T, iteratee: ObjectIterator<T, U>): Record<keyof T, U>;
/**
 * 对两个对象，进行递归合并
 * @param target - 目标对象
 * @param sources - 源对象数组
 * @returns - 合并后的对象
 * @public
 */
declare function merge(target: AnyObject, ...sources: AnyObject[]): AnyObject;
/**
 * 移除对象中不能被json序列化的属性
 * @param obj - 要处理的对象
 * @returns - 移除不可序列化属性后的对象
 * @public
 */
declare function removeNonSerializableProps(obj: Record<any, any> | null | undefined): Record<string, unknown> | null | undefined;
/**
 * 移除对象中不能序列化的属性后，再执行JSON.stringify
 * @param obj - 要序列化的对象
 * @returns - JSON字符串
 * @public
 */
declare function safeJsonStringify(obj: AnyObject | null | undefined): string;
/**
 * 反转对象的键值对
 * @param obj - 源对象
 * @returns 键值对反转后的新对象
 * @public
 */
declare const invert: <TKey extends PropertyName, TValue extends PropertyName>(obj: Record<TKey, TValue>) => Record<TValue, TKey>;
//#endregion
export { invert, mapKeys, mapValues, merge, omit, omitBy, pick, pickBy, removeNonSerializableProps, safeJsonStringify };