【封装】封装storage工具

/* 函数封装localStorage & sessionStorage */

interface StorageInterface {
  /** 设置localStorage */
  set: (key: string, value: any, expires?: number) => void;
  /** 获取localStorage,会自动转json */
  get: (key: string) => any;
  /** 是否含有key */
  has: (key: string) => boolean;
  /** 移除 */
  del: (key: string) => void;
  /** 移除全部缓存 */
  clear: () => void;
  /** 移除自己前缀的全部缓存 */
  clearSelf: () => void;
}
type StorageType = (storage: Storage) => StorageInterface;

/** 写入时间 */
const writeTime: number = Number(new Date());
/** 前缀 */
const keyPrefix = '_MY_PREFIX_';

/**
 * 查询Storage是否为空
 * @param {any} value
 * @returns
 */
const isNotExist = (value: any) => {
  return value === null || typeof value === 'undefined';
};

/**
 * 判断 value 值是否过期
 * @param value 值
 */
const isOutPeriod = (value: any) => {
  if (!value.value) {
    return true;
  }
  let readTime = Number(new Date());
  return readTime - value.writeTime > value.expired;
};

/**
 * 给key值添加前缀
 * @param {string} key
 * @returns
 */
const addPrefix = (key: string) => {
  return `${keyPrefix}${key}`;
};

const storageMethod: StorageType = storage => ({
  /**
   * set 方法,设置
   * @param value 值
   * @param expired writeTime 写入时间,单位:ms
   */
  set(key, value, expired) {
    const skey = addPrefix(key);
    let data = {
      value,
      writeTime: writeTime, // 写入时间,继承自 Stroage
      expired,
    };
    // 值是数组,不能直接存储,需要转换 JSON.stringify
    storage.setItem(skey, JSON.stringify(data));
  },

  /**
   * get 方法,获取
   * @param key 键
   */
  get(key) {
    const skey = addPrefix(key);
    const dataJSON: any = localStorage.getItem(skey);
    // 当目标不存在时直接结束
    if (isNotExist(dataJSON)) {
      return null;
    }
    let data = JSON.parse(dataJSON);
    // 当数据的存在周期未定义时,它被认为是永久的
    if (isNotExist(data.expired)) {
      return data.value;
    }
    // 数据声明期结束时释放数据
    if (isOutPeriod(data)) {
      this.del(skey);
      return null;
    }
    return data.value;
  },

  /**
   * del 方法,删除
   * @param key 键
   */
  del(key) {
    const skey = addPrefix(key);
    storage.removeItem(skey);
  },

  /**
   * 移除全部缓存
   */
  clear() {
    storage.clear();
  },

  /**
   * 是否存在storage
   * @param {string} key
   * @returns {boolean}
   */
  has(key: string): boolean {
    const skey = addPrefix(key);
    return !!storage.getItem(skey);
  },

  /**
   * 移除自己前缀的全部缓存
   */
  clearSelf() {
    const arr = Array.from({ length: storage.length }, (_, i) => storage.key(i)).filter(str =>
      str?.startsWith(keyPrefix),
    );
    arr.forEach(str => storage.removeItem(<string>str));
  },
});

const localstorage = storageMethod(window.localStorage);
const sessionstorage = storageMethod(window.sessionStorage);

export { localstorage, sessionstorage };
/* class封装localStorage & sessionStorage封装,缓存对象 */

class StorageMethod {
  storage: Storage;
  writeTime: number;
  keyPrefix: '_MY_PREFIX_';

  constructor(type: string) {
    if (type === 'localStorage') {
      this.storage = window.localStorage;
    } else {
      this.storage = window.sessionStorage;
    }
    this.writeTime = Number(new Date()); // 写入时间
    /** key前缀 */
    this.keyPrefix = '_LBSP_';
  }
  /**
   * 查询Storage是否为空
   * @param {any} value
   * @returns
   */
  isNotExist(value: any) {
    return value === null || typeof value === 'undefined';
  }

  /**
   * 判断 value 值是否过期
   * @param value 值
   */
  isOutPeriod(value: any) {
    if (!value.value) {
      return true;
    }
    let readTime = Number(new Date());
    return readTime - value.writeTime > value.expired;
  }

  /**
   * 给key值添加前缀
   * @param {string} key
   * @returns
   */
  addPrefix(key: string) {
    return `${this.keyPrefix}${key}`;
  }

  /**
   * set 方法,设置
   * @param key String 键
   * @param value 值
   * @param expired writeTime 写入时间,单位:ms
   */
  set(key: string, value: any, expired?: number) {
    const skey = this.addPrefix(key);
    let data = {
      value,
      writeTime: this.writeTime, // 写入时间,继承自 Stroage
      expired,
    };
    // 值是数组,不能直接存储,需要转换 JSON.stringify
    this.storage.setItem(skey, JSON.stringify(data));
  }

  /**
   * get 方法,获取
   * @param key 键
   */
  get(key: string) {
    const skey = this.addPrefix(key);
    const dataJSON: any = localStorage.getItem(skey);
    // 当目标不存在时直接结束
    if (this.isNotExist(dataJSON)) {
      return null;
    }
    let data = JSON.parse(dataJSON);
    // 当数据的存在周期未定义时,它被认为是永久的
    if (this.isNotExist(data.expired)) {
      return data.value;
    }
    // 数据声明期结束时释放数据
    if (this.isOutPeriod(data)) {
      this.del(skey);
      return null;
    }
    return data.value;
  }

  /**
   * del 方法,删除
   * @param key 键
   */
  del(key: string) {
    const skey = this.addPrefix(key);
    this.storage.removeItem(skey);
  }

  /**
   * 是否存在storage
   * @param {string} key
   * @returns {boolean}
   */
  has(key: string): boolean {
    const skey = this.addPrefix(key);
    return !!this.storage.getItem(skey);
  }

  /**
   * 移除全部缓存
   */
  clear() {
    this.storage.clear();
  }

  /**
   * 移除自己前缀的全部缓存
   */
  clearSelf() {
    const arr = Array.from({ length: this.storage.length }, (_, i) =>
      this.storage.key(i),
    ).filter(str => str?.startsWith(this.keyPrefix));
    arr.forEach(str => this.storage.removeItem(<string>str));
  }
}
const localstorage = new StorageMethod('localStorage');
const sessionstorage = new StorageMethod('sessionStorage');

export { localstorage, sessionstorage };

封装Playwright是指将Playwright的功能进行封装,以便在前端自动化测试中更方便地使用。下面是关于封装Playwright的两个方面的介绍: 1. 优化类型约束和提示:通过自定义泛型工具获取函数第二个参数类型[^1]。 ```typescript export type GetSecondArgs<T> = T extends (_: any, arg: infer R) => any ? R : any; ``` 这段代码定义了一个泛型工具`GetSecondArgs`,它可以用来获取函数类型的第二个参数类型。在封装Playwright时,可以使用这个工具来提供更准确的类型约束和提示。 2. 用户鉴权相关:在封装Playwright时,可以使用全局设置(globalSetup)来执行一段脚本,在其中进行用户登录并保存登录状态。 ```typescript const config: PlaywrightTestConfig = { globalSetup: require.resolve('./global-setup/index.ts') } ``` 这段代码中的`globalSetup`指定了一个脚本文件,该文件会在执行用例之前被触发。在这个脚本中,可以执行用户登录操作,并将登录状态保存到文件中,以便后续的用例可以读取该文件进行登录鉴权。 另外,在页面中使用`storageState`选项可以实现保存用户状态。 ```typescript import { test } from '@playwright/test'; test.use({ storageState: 'adminStorageState.json' }); ``` 这段代码中的`storageState`选项指定了一个存储状态文件,该文件包含了用户的登录状态。在测试中使用这个选项,可以在每次运行测试时自动加载用户状态,从而实现用户鉴权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tinky.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值