Vue3 使用 Ts 泛型 封装本地存储

news/2024/5/20 2:33:00 标签: html, 前端, Ts, 泛型, js
htmledit_views">

9a69fede8b2044a79dd834e3e48f20b4.png前期回顾f8e3cc1a0f694ac2b665ca2ad14c49d7.png   

NVM —— 你把我玩明白_彩色之外的博客-CSDN博客本文将学习 使用 NVM 管理node版本https://blog.csdn.net/m0_57904695/article/details/130670262?spm=1001.2014.3001.5501 

目录

 新建  \src\utils\storage-utils.ts

使用

泛型示例

泛型交换变量

泛型 string

泛型 对象

本文完!


👍 本文专栏:开发技巧  

 新建  \src\utils\storage-utils.ts

interface StorageUtilsInterface<T> {
  set(key: string, value: T): void;
  get(key: string): T | null;
  remove(key: string): void;
}

class LocalStorageUtils<T> implements StorageUtilsInterface<T> {
  set(key: string, value: T): void {
    localStorage.setItem(key, JSON.stringify(value));
  }

  get(key: string): T | null {
    const item = localStorage.getItem(key);
    if (item) {
      try {
        return JSON.parse(item);
      } catch (error) {
        console.error("Error parsing stored value:", error);
      }
    }
    return null;
  }

  remove(key: string): void {
    localStorage.removeItem(key);
  }
}

class SessionStorageUtils<T> implements StorageUtilsInterface<T> {
  set(key: string, value: T): void {
    sessionStorage.setItem(key, JSON.stringify(value));
  }

  get(key: string): T | null {
    const item = sessionStorage.getItem(key);
    if (item) {
      try {
        return JSON.parse(item);
      } catch (error) {
        console.error("Error parsing stored value:", error);
      }
    }
    return null;
  }

  remove(key: string): void {
    sessionStorage.removeItem(key);
  }
}

export { LocalStorageUtils, SessionStorageUtils };

使用


onMounted(() => {
  
  const localStorageUtils = new LocalStorageUtils<string>();

  // 设置localStorage
  localStorageUtils.set("username", "张坤");

  // 获取localStorage
  const username = localStorageUtils.get("username");
  console.log("username=====>", username); // "张坤"

  // 删除localStorage
  // setTimeout(() => {
  //   localStorageUtils.remove("username");
  // }, 2000);

  const sessionStorageUtils = new SessionStorageUtils<number>();

  // 设置sessionStorage
  sessionStorageUtils.set("age", 18);

  // 获取sessionStorage
  const age = sessionStorageUtils.get("age");
  console.log("age=====>", age); // 18

  // 删除sessionStorage
  // setTimeout(() => {
  //   sessionStorageUtils.remove("age");
  // }, 4000);
});

泛型示例

首先,什么是泛型

泛型是一种模板机制,它允许在定义函数、类、接口等时使用类型参数(也称为类型变量),从而实现代码的复用。这里的类型参数可以是任何类型,在使用时可以传入具体的类型。

举个例子,假设我们要写一个函数来交换两个变量的值:

泛型交换变量

function swap(a: { value: any }, b: { value: any }) {
  const temp = a.value;
  a.value = b.value;
  b.value = temp;
}

let x = { value: 1 };
let y = { value: 2 };

swap(x, y);

console.log(x.value, y.value); // 输出 2, 1

上面的代码看起来没什么问题,但是有一个问题是:函数参数的类型都是any,也就是说这个函数可以交换任意类型的值,包括字符串、对象等等,这并不是我们想要的。

这时候,我们可以使用泛型来改进这个函数:

 function swap<T>(tuple: [T, T]): [T, T] {
    return [tuple[1], tuple[0]];
  }
  let tuple: [string, string] = ["张坤", "18"];
  console.log("交换前:", tuple);
  tuple = swap(tuple);
  console.log("交换后:", tuple);

输出:

交换前:Array [ "张坤", "18" ]

交换后:Array [ "18", "张坤" ]

在这个例子中,我们使用了类型参数<T>,并将其应用到函数参数上。这样,我们就可以指定要交换的值的类型。

泛型 string

接下来,再看看泛型接口StorageUtilsInterface<T>

这个接口定义了三个方法——set()get()remove(),它们都使用了类型参数<T>`,表示这些方法可以处理任意类型的值。比如,如果我们用这个接口存储一个字符串类型的值

const storage: StorageUtilsInterface<string> = new LocalStorageUtils();

storage.set('name', 'Tom');

const name = storage.get('name'); // name 的类型为 string | null

这里我们将<T>替换成了string,这样这个接口中的方法就会操作字符串类型的值了。

泛型 对象

如果要存储对象类型的值,可以将StorageUtilsInterface<T>中的类型参数<T>替换为对象类型。比如,假设我们有一个用户对象:

interface User {
  name: string;
  age: number;
}

const user: User = { name: 'Tom', age: 18 };

我们可以使用泛型接口StorageUtilsInterface<T>来存储这个对象:

const storage: StorageUtilsInterface<User> = new LocalStorageUtils();

storage.set('user', user);

const savedUser = storage.get('user'); // savedUser 的类型为 User | null

这里我们将<T>替换成了User,这样这个接口中的方法就会操作User类型的值了。在调用set()方法时,我们需要将user对象传给它,并且在调用get()方法后,返回的值的类型也会变成User | null,表示可能返回一个User类型的值或者null

需要注意的是,在这个例子中,User类型必须是一个可序列化的对象,即该对象可以转换为字符串并通过JSON.parse()方法解析回来。否则,在调用set()方法时会抛出异常。为了确保对象可序列化,我们可以为User类型添加一个[Serializable]标记,或者手动实现toJSON()fromJSON()方法。

本文完!


http://www.niftyadmin.cn/n/325260.html

相关文章

【重制版】10分钟学会WINDOWS、MAC、LINUX如何安装GPT桌面版

文章目录 1 前言2 Windows版下载安装2.1 安装包2.2 winget下载 &#xff08;注意看&#xff0c;不是wget&#xff01;&#xff09; 3 Mac版下载安装3.1 安装包3.2 homebrew安装 4 Linux版下载安装4.1 安装包4.2 终端下载 5 特点5.1 软件特点5.2 菜单功能&#xff08;个人喜好特…

开源的表单系统效果怎么样?

当前&#xff0c;开源的表单系统得到了企业的重视和喜爱&#xff0c;因为它的简洁、灵活、便捷等优势特点&#xff0c;助力企业提质增效&#xff0c;各部门之间的协作沟通效率得到提升&#xff0c;数据资源也获得了有效整理和应用。今天&#xff0c;我们就一起来看看开源的表单…

Java后端入职第三天,使用CompletableFuture优化查询接口

一、需求背景 相信大家入职到一个新公司(xinkeng),一般都会被分配去解决千古难题(caipigu),这些问题大概率很多不想去解决,并且代码很多复杂,各种套娃。领导为检验新人的能力,就会去让新人去解决这种问题,一方面可以了解业务代码,还能顺手把没人愿意做的事做了。但…

MYSQL 之 Redis配置与优化

&#xff08;一&#xff09;关系数据库和非关系数据库 关系库数据库Oracle &#xff0c;mysql &#xff0c;sql&#xff0c;server&#xff0c;microsoft Access &#xff0c;postgresql 以上数据库必须先建表在设计表的结构&#xff0c;然后存储的时侯按表的结构去存&#x…

软件测试月薪2万,需要技术达到什么水平?

最近跟朋友在一起聚会的时候&#xff0c;提了一个问题&#xff0c;说一个软件测试工程师如何能月薪达到二万&#xff0c;技术水平需要达到什么程度&#xff1f;人回答说这只能是大企业或者互联网企业工程师才能拿到。也许是的&#xff0c;小公司或者非互联网企业拿二万的不太可…

最新DNDC模型在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。。DNDC&#xff08;Denitrification-Decomposition&#xff0c;反硝化-分解模型&#xff09;是目前国际上最为成功的模拟生物地球化学循环的模型之一&a…

出现找不到msvcp140.dll无法继续执行代码要怎么解决?

出现找不到msvcp140.dll无法继续执行代码要怎么解决&#xff1f;当你尝试在Windows系统上运行某些程序或游戏时&#xff0c;可能会遇到“找不到msvcp140.dll无法继续执行代码”的错误提示。这个错误通常表示你的系统缺少了msvcp140.dll文件&#xff0c;而这个文件是Visual C Re…

SpringCloud源码探析(六)-消息队列RabbitMQ

1.概述 RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它是基于Erlang语言开发&#xff0c;并且是基于AMQP协议的。由于Erlang语言最初使用与交换机领域架构&#xff0c;因此使得RabbitMQ在Broker之间的数据交互具有良好的性能。AMQP(Advanced Message Queuing Protoc…