@yiero/gmlib
Version:
GM Lib for Tampermonkey/ScriptCat
311 lines (310 loc) • 8.09 kB
TypeScript
import { GmStorage, type IGMStorageChangeDetail } from './GmStorage';
/**
* 对象存储遍历回调函数类型
*/
type ObjectForEachCallback<T> = (value: T[keyof T], key: keyof T, obj: T) => void;
/**
* 对象存储映射回调函数类型
*/
type ObjectMapCallback<T, U> = (value: T[keyof T], key: keyof T, obj: T) => U;
/**
* 对象存储过滤回调函数类型
*/
type ObjectFilterCallback<T> = (value: T[keyof T], key: keyof T, obj: T) => boolean;
/**
* 油猴对象存储管理类
*
* 继承 `GmStorage` 类,专门用于处理对象类型的数据存储。
* 提供了一系列对象操作方法(如 `getItem`、`setItem`、`assign`、`pick` 等),
* 并确保存储的值始终是对象类型。该类适用于需要管理配置型数据的用户脚本。
*
* @warn 需要授权函数 `GM_getValue`、`GM_setValue`、`GM_deleteValue`、
* `GM_addValueChangeListener`、`GM_removeValueChangeListener`
*
* @example
* ```ts
* // 创建用户设置存储
* const userSettings = new GmObjectStorage<{
* theme: 'light' | 'dark';
* fontSize: number;
* notifications: boolean;
* }>('user_settings', {
* theme: 'light',
* fontSize: 14,
* notifications: true
* });
*
* // 获取单个设置
* const theme = userSettings.getItem('theme');
*
* // 修改单个设置
* userSettings.setItem('theme', 'dark');
* ```
*/
export declare class GmObjectStorage<T extends Record<string, any>> extends GmStorage<T> {
constructor(key: string, defaultValue?: T);
/**
* 获取当前存储的对象
*
* @alias get()
*
* @note 返回浅拷贝以防止外部修改影响存储
*/
get value(): T;
/**
* 获取当前存储的对象
*
* @returns 存储的对象(浅拷贝)
*
* @note 返回浅拷贝以防止外部修改影响存储
*/
get(): T;
/**
* 获取对象中键的数量
*/
get size(): number;
/**
* 获取对象所有键名数组
*/
get keys(): (keyof T)[];
/**
* 获取对象所有值数组
*/
get values(): T[keyof T][];
/**
* 获取对象所有键值对数组
*/
get entries(): [keyof T, T[keyof T]][];
/**
* 设置整个对象
*
* @param value - 要设置的对象
*/
set(value: T): void;
/**
* 重置存储为默认对象值
*/
reset(): void;
/**
* 清空存储为空对象
*/
clear(): void;
/**
* 获取指定键的值
*
* @param key - 要获取的键
* @returns 键对应的值,不存在时返回 `undefined`
*
* @example
* ```ts
* const theme = settings.getItem('theme');
* ```
*/
getItem<K extends keyof T>(key: K): T[K] | undefined;
/**
* 设置单个键值对
*
* @param key - 要设置的键
* @param value - 要设置的值
*
* @example
* ```ts
* settings.setItem('theme', 'dark');
* ```
*/
setItem<K extends keyof T>(key: K, value: T[K]): void;
/**
* 删除指定键
*
* @param key - 要删除的键
*
* @example
* ```ts
* settings.removeItem('theme');
* ```
*/
removeItem<K extends keyof T>(key: K): void;
/**
* 检查指定键是否存在
*
* @param key - 要检查的键
* @returns 是否存在
*
* @example
* ```ts
* if (settings.hasItem('theme')) {
* console.log('主题已设置');
* }
* ```
*/
hasItem<K extends keyof T>(key: K): boolean;
/**
* 合并属性到存储对象
*
* @param partial - 要合并的部分对象
*
* @example
* ```ts
* settings.assign({ theme: 'dark', fontSize: 16 });
* ```
*/
assign(partial: Partial<T>): void;
/**
* 选取指定键返回新对象(不修改存储)
*
* @param keys - 要选取的键名
* @returns 包含指定键的新对象
*
* @example
* ```ts
* const displaySettings = settings.pick('theme', 'fontSize');
* ```
*/
pick<K extends keyof T>(...keys: K[]): Pick<T, K>;
/**
* 排除指定键返回新对象(不修改存储)
*
* @param keys - 要排除的键名
* @returns 不包含指定键的新对象
*
* @example
* ```ts
* const publicSettings = settings.omit('apiKey', 'secret');
* ```
*/
omit<K extends keyof T>(...keys: K[]): Omit<T, K>;
/**
* 遍历对象所有属性(不修改存储)
*
* @param callback - 遍历回调函数
*
* @example
* ```ts
* settings.forEach((value, key) => {
* console.log(`${key}: ${value}`);
* });
* ```
*/
forEach(callback: ObjectForEachCallback<T>): void;
/**
* 映射所有值返回新对象(不修改存储)
*
* @param callback - 映射回调函数
* @returns 映射后的新对象
*
* @example
* ```ts
* const upperCaseSettings = settings.map((value) => {
* return typeof value === 'string' ? value.toUpperCase() : value;
* });
* ```
*/
map<U>(callback: ObjectMapCallback<T, U>): Record<string, U>;
/**
* 映射所有值并更新存储
*
* @param callback - 映射回调函数
*
* @example
* ```ts
* // 将所有字符串值转为大写
* settings.mapInPlace((value) => {
* return typeof value === 'string' ? value.toUpperCase() : value;
* });
* ```
*/
mapInPlace(callback: ObjectMapCallback<T, T[keyof T]>): void;
/**
* 过滤属性返回新对象(不修改存储)
*
* @param callback - 过滤回调函数
* @returns 过滤后的新对象
*
* @example
* ```ts
* const truthySettings = settings.filter((value) => Boolean(value));
* ```
*/
filter(callback: ObjectFilterCallback<T>): Partial<T>;
/**
* 过滤属性并更新存储
*
* @param callback - 过滤回调函数
*
* @example
* ```ts
* // 移除所有空值
* settings.filterInPlace((value) => value !== null && value !== undefined);
* ```
*/
filterInPlace(callback: ObjectFilterCallback<T>): void;
/**
* 查找满足条件的第一个属性的键值对
*
* @param callback - 条件回调函数
* @returns 键值对,未找到时返回 `undefined`
*
* @example
* ```ts
* const entry = settings.find((value) => value === 'dark');
* if (entry) {
* console.log(`找到: ${entry[0]} = ${entry[1]}`);
* }
* ```
*/
find(callback: ObjectFilterCallback<T>): [keyof T, T[keyof T]] | undefined;
/**
* 查找满足条件的第一个键名
*
* @param callback - 条件回调函数
* @returns 键名,未找到时返回 `undefined`
*
* @example
* ```ts
* const key = settings.findKey((value) => value === 'dark');
* ```
*/
findKey(callback: ObjectFilterCallback<T>): keyof T | undefined;
/**
* 检查是否存在满足条件的属性
*
* @param callback - 条件回调函数
* @returns 是否存在
*
* @example
* ```ts
* if (settings.some((value) => value === 'dark')) {
* console.log('存在 dark 主题设置');
* }
* ```
*/
some(callback: ObjectFilterCallback<T>): boolean;
/**
* 检查是否所有属性都满足条件
*
* @param callback - 条件回调函数
* @returns 是否全部满足
*
* @example
* ```ts
* if (settings.every((value) => Boolean(value))) {
* console.log('所有设置都有效');
* }
* ```
*/
every(callback: ObjectFilterCallback<T>): boolean;
/**
* 判断对象是否为空
*
* @returns 是否为空对象
*
* @example
* ```ts
* if (settings.isEmpty()) {
* console.log('暂无设置');
* }
* ```
*/
isEmpty(): boolean;
}
export type { IGMStorageChangeDetail };