前言

希望存储一个对象的时候能自动JSON转成字符串,存储一个string类型的值时,不需要再JSON化了,不然又多两引号,和原生存储使用会有出入,我的宗旨就是能和原生效果保持一致的情况下增加一些方便的处理。

拿取的时候就会有一些顾虑了,因为拿到的值就是字符串类型,所以我加了一个额外的参数来判断是否需要JSON解析,默认是需要的,这个配置用于这个值我可能自己手动转成字符串存的,它的源值是一个对象,我不希望取值的时候被解析出来,我就要它原样给我,应对这种情况加了一个配置判定。

在拿取的时候返回的值类型是any,显然这不是我想要的,我希望能准确判定这个类型,于是通过泛型的方式进行约束。

另一个考量是我希望我的key在存储的时候能够特殊一点,不会与其他的存储混在一起,简单的办法就是加入前缀了,于是我加入了prefix配置,本来我是希望这个配置设置后不为空字符串的,但是转念一想,有的时候我们可能就希望不要前缀,但是又能使用已封装的方法便捷性,于是允许了可以为空字符串。

源码

/** 存储类型 */
export type StorageType = "local" | "session";
/** 存储类配置参数 */
export type StorageOptions = {
  type?: StorageType;
  prefix?: string;
};

class JJStorage {
  private storage: Storage;
  private prefix: string = "";

  constructor(options: StorageOptions) {
    const { type, prefix } = options;

    switch (type) {
      case "local":
        this.storage = window.localStorage;
        break;
      case "session":
        this.storage = window.sessionStorage;
        break;
      default:
        this.storage = window.localStorage;
    }

    if (prefix) {
      this.prefix = prefix;
    }
  }

  /** 存储数据 */
  public setItem(key: string, value: any) {
    key = this.prefix + key;
    if (typeof value === "string") {
      this.storage.setItem(key, value);
      return;
    }

    try {
      this.storage.setItem(key, JSON.stringify(value));
    } catch (error) {
      console.error("存储数据失败:", error);
    }
  }

  /** 获取数据 */
  public getItem<T>(key: string, isJson: boolean = true) {
    key = this.prefix + key;
    const value = this.storage.getItem(key);
    if (!value) return null;

    if (!isJson) return value as T;
    try {
      return JSON.parse(value) as T;
    } catch (error) {
      return value as T;
    }
  }

  /** 删除数据 */
  public removeItem(key: string) {
    key = this.prefix + key;
    this.storage.removeItem(key);
  }

  /** 清空数据 */
  public clear() {
    this.storage.clear();
  }
}

/** 实例化 */
const jjLocal = new JJStorage({ type: "local", prefix: "jj_" });

export { JJStorage, jjLocal };
分类: TypeScript 标签: TypeScriptlocalStoragesessionStorage

评论

暂无评论数据

暂无评论数据

目录