@pisell/pisellos
Version:
一个可扩展的前端模块化SDK框架,支持插件系统
179 lines (178 loc) • 5.33 kB
TypeScript
import App from "../app";
/**
* IndexDB 管理器模块
*
* 这个模块提供了对浏览器 IndexedDB 的简单封装,并在不支持 IndexedDB 的环境中
* 自动降级使用 localStorage 作为备选存储方案。
*/
/**
* 数据库配置选项接口
* @interface DBOptions
* @property {string} dbName - 数据库名称
* @property {number} version - 数据库版本号
* @property {Array} stores - 存储对象配置数组
* @property {string} stores[].name - 存储对象名称
* @property {string} stores[].keyPath - 主键路径
* @property {Array} [stores[].indexes] - 索引配置数组(可选)
* @property {string} stores[].indexes[].name - 索引名称
* @property {string} stores[].indexes[].keyPath - 索引键路径
* @property {IDBIndexParameters} [stores[].indexes[].options] - 索引选项(可选)
*/
export interface DBOptions {
dbName: string;
version: number;
stores: {
name: string;
keyPath: string;
indexes?: {
name: string;
keyPath: string;
options?: IDBIndexParameters;
}[];
}[];
}
/**
* IndexDB 管理器类
* 提供对 IndexedDB 的简单封装,支持自动降级到 localStorage
* @class IndexDBManager
*/
declare class IndexDBManager {
/**
* 检查环境是否支持 IndexedDB
* @returns {boolean} 是否支持 IndexedDB
* @private
*/
private static isSupported;
private db;
private dbName;
private version;
private stores;
private useIndexDB;
private app;
/**
* 创建 IndexDBManager 实例
* @param {DBOptions} options - 数据库配置选项
*/
constructor(app: App, options: DBOptions);
/**
* 初始化数据库连接
* 如果环境不支持 IndexedDB,将自动使用 localStorage
* @returns {Promise<boolean>} 连接是否成功
*/
connect(): Promise<boolean>;
/**
* 生成用于 localStorage 的存储键
* @param {string} storeName - 存储对象名称
* @param {string|number} [key] - 可选的键值
* @returns {string} 格式化的存储键
* @private
*/
private getStorageKey;
/**
* 添加数据到指定的存储对象
* @param {string} storeName - 存储对象名称
* @param {T} data - 要添加的数据
* @returns {Promise<T>} 添加的数据
* @template T
*/
add<T>(storeName: string, data: T): Promise<T>;
/**
* 获取指定存储对象中的数据
* @param {string} storeName - 存储对象名称
* @param {string|number} key - 数据主键
* @returns {Promise<T|null>} 获取的数据,不存在则返回 null
* @template T
*/
get<T>(storeName: string, key: string | number): Promise<T | null>;
/**
* 更新指定存储对象中的数据
* @param {string} storeName - 存储对象名称
* @param {T} data - 要更新的数据
* @returns {Promise<T>} 更新后的数据
* @template T
*/
update<T>(storeName: string, data: T): Promise<T>;
/**
* 删除指定存储对象中的数据
* @param {string} storeName - 存储对象名称
* @param {string|number} key - 数据主键
* @returns {Promise<boolean>} 删除是否成功
*/
delete(storeName: string, key: string | number): Promise<boolean>;
/**
* 获取指定存储对象中的所有数据
* @param {string} storeName - 存储对象名称
* @returns {Promise<T[]>} 数据数组
* @template T
*/
getAll<T>(storeName: string): Promise<T[]>;
/**
* 清空指定存储对象中的所有数据
* @param {string} storeName - 存储对象名称
* @returns {Promise<boolean>} 清空是否成功
*/
clear(storeName: string): Promise<boolean>;
/**
* 关闭数据库连接
* 在不再需要使用数据库时调用,释放资源
*/
close(): void;
/**
* 获取当前使用的存储方式
* @returns {'indexDB'|'localStorage'} 当前使用的存储方式
*/
getCurrentStorage(): 'indexDB' | 'localStorage';
}
/**
* 使用示例:
*
* // 1. 创建数据库配置
* const dbOptions: DBOptions = {
* dbName: 'myApp',
* version: 1,
* stores: [
* {
* name: 'users',
* keyPath: 'id',
* indexes: [
* { name: 'email', keyPath: 'email', options: { unique: true } }
* ]
* },
* {
* name: 'products',
* keyPath: 'id'
* }
* ]
* };
*
* // 2. 创建并连接数据库
* const db = new IndexDBManager(dbOptions);
* await db.connect();
*
* // 3. 添加数据
* const user = { id: '1', name: '张三', email: 'zhangsan@example.com' };
* await db.add('users', user);
*
* // 4. 获取数据
* const retrievedUser = await db.get('users', '1');
*
* // 5. 更新数据
* user.name = '张三 (已更新)';
* await db.update('users', user);
*
* // 6. 获取所有数据
* const allUsers = await db.getAll('users');
*
* // 7. 删除数据
* await db.delete('users', '1');
*
* // 8. 清空存储对象
* await db.clear('users');
*
* // 9. 关闭数据库连接
* db.close();
*
* // 10. 检查当前使用的存储方式
* const storageType = db.getCurrentStorage(); // 'indexDB' 或 'localStorage'
*/
export default IndexDBManager;