理解typeScript中的泛型,并在vue3项目中使用

泛型(Generics)是 TypeScript 中一个非常强大的特性,它允许你在编写代码时定义类型参数,并在使用时指定具体的类型。这使得你的代码更加灵活和可复用,同时也能够保持类型的安全性。

泛型的基本概念

在 TypeScript 中,泛型通常用于函数、类、接口和类型别名中。泛型允许你在定义函数或类等构造时使用类型占位符,这些占位符在实际使用时会被具体的类型替换。

应用场景

1. 泛型函数

泛型函数允许你在函数签名中定义类型参数,并在函数体中使用这些类型参数。这样可以确保函数在处理不同类型的数据时保持类型安全。

示例:交换两个值的位置
function swap<T, U>(first: T, second: U): [U, T] {return [second, first];
}const result = swap<number, string>(10, 'hello');
console.log(result); // 输出 ['hello', 10]

在这个例子中,swap 函数接受两个类型参数 TU,分别代表两个值的类型。函数返回一个元组,其中元素的顺序互换了。

2. 泛型类

泛型类允许你在类定义时定义类型参数,并在类的成员中使用这些类型参数。这样可以创建更加通用的类,适用于多种类型的数据。

示例:创建一个通用的容器类
class Container<T> {private items: T[] = [];addItem(item: T): void {this.items.push(item);}getItems(): T[] {return this.items;}
}const containerString = new Container<string>();
containerString.addItem('apple');
containerString.addItem('banana');
console.log(containerString.getItems()); // 输出 ['apple', 'banana']const containerNumber = new Container<number>();
containerNumber.addItem(1);
containerNumber.addItem(2);
console.log(containerNumber.getItems()); // 输出 [1, 2]

在这个例子中,Container 类接受一个类型参数 T,代表存储在容器中的元素类型。通过使用泛型,我们可以在不同的上下文中创建不同类型的容器实例。

3. 泛型接口

泛型接口允许你在定义接口时定义类型参数,并在接口的成员中使用这些类型参数。这样可以创建更加通用的接口,适用于多种类型的数据。

示例:定义一个通用的键值对接口
interface KeyValue<T, U> {key: T;value: U;
}const keyValueStringNumber: KeyValue<string, number> = {key: 'age',value: 25
};const keyValueNumberString: KeyValue<number, string> = {key: 1,value: 'one'
};console.log(keyValueStringNumber); // 输出 { key: 'age', value: 25 }
console.log(keyValueNumberString); // 输出 { key: 1, value: 'one' }

在这个例子中,KeyValue 接口接受两个类型参数 TU,分别代表键和值的类型。通过使用泛型,我们可以在不同的上下文中定义不同类型的键值对。

4. 泛型类型别名

泛型类型别名允许你在定义类型时定义类型参数,并在类型定义中使用这些类型参数。这样可以创建更加通用的类型,适用于多种类型的数据。

示例:定义一个通用的键值对类型
type KeyValuePair<T, U> = {key: T;value: U;
};const pairStringNumber: KeyValuePair<string, number> = {key: 'age',value: 25
};const pairNumberString: KeyValuePair<number, string> = {key: 1,value: 'one'
};console.log(pairStringNumber); // 输出 { key: 'age', value: 25 }
console.log(pairNumberString); // 输出 { key: 1, value: 'one' }

在这个例子中,KeyValuePair 类型别名接受两个类型参数 TU,分别代表键和值的类型。通过使用泛型,我们可以在不同的上下文中定义不同类型的键值对。

应用到 Vue 3 的 ref 变量

在 Vue 3 中,ref 函数返回一个带有 .value 属性的对象,这个对象包含了响应式数据。如果我们想创建一个通用的 ref 函数,可以使用泛型来实现。

示例:定义泛型 ref 变量
import { ref } from 'vue';// 定义一个通用的 createRef 函数
function createRef<T>(initialValue: T): ReturnType<typeof ref<T>> {return ref(initialValue);
}// 使用 createRef 函数创建不同类型的 ref 变量
const numberRef = createRef<number>(10);
const stringRef = createRef<string>('Initial value');// 更新 ref 变量
numberRef.value = 20;
stringRef.value = 'Updated value';// 访问 ref 变量
console.log(numberRef.value); // 输出 20
console.log(stringRef.value); // 输出 "Updated value"
解释
1. 定义泛型函数
function createRef<T>(initialValue: T): ReturnType<typeof ref<T>> {return ref(initialValue);
}

这个 createRef 函数接受一个类型参数 T,表示 ref 变量的类型。initialValue 参数的类型为 T,表示可以传递任何类型的初始值。

2. 使用泛型函数
const numberRef = createRef<number>(10);
const stringRef = createRef<string>('Initial value');

在这里,我们分别为 numberstring 类型创建了 ref 变量。

3. 更新和访问 ref 变量
numberRef.value = 20;
stringRef.value = 'Updated value';console.log(numberRef.value); // 输出 20
console.log(stringRef.value); // 输出 "Updated value"

我们可以像平常一样更新和访问 ref 变量。

泛型的好处

  • 类型安全性:通过泛型可以确保你在创建 ref 变量时提供正确的类型。
  • 代码复用性:一个泛型函数可以用于多种类型,减少了重复代码。
  • 灵活性:你可以根据需要创建不同类型的 ref 变量,而不必为每种类型写单独的函数。

通过这种方式,你可以轻松地在 Vue 3 中使用 TypeScript 来创建通用的 ref 变量,同时保持代码的类型安全性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2028.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

spring ai 入门 之 结构化输出 - 把大模型llm返回的内容转换成java bean

目录 ​编辑 将AI非结构化文本转换为特定格式数据的应用场景说明 Spring AI 介绍 &#xff1a;为Java开发者打造的AI应用开发框架 Qwen 介绍 &#xff1a; 一个国内领先的开源大模型 Spring AI Alibaba框架介绍 &#xff1a; 一个国内最好的spring ai实现 使用spring ai …

深入解析:物联网技术及其应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 深入解析&#xff1a;物联网技术及其应用 深入解析&#xff1a;物联网技术及其应用 深入解析&#xff1a;物联网技术及其应用 物…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

Python装饰器执行的顺序你知道吗

1. 引言 前面的文章中&#xff0c;讲到了 Python 装饰器的基础使用方式&#xff0c;在实际使用中&#xff0c;可能会遇到一个函数使用多个装饰器的情况&#xff0c;这个时候装饰器的顺序同样至关重要。本文将讨论装饰器的顺序如何影响函数的行为&#xff0c;并通过几个例子来说…

嵌入式操作系统FreeRTOS文件详解

系列文章目录 嵌入式操作系统FreeRTOS文件详解 嵌入式操作系统FreeRTOS文件详解 系列文章目录FreeRTOS下载 FreeRTOS下载 官网下载解压后得到的文件&#xff0c;如下图所示&#xff1a; 打开图 1.3.1.2 中的 FreeRTOS 子文件夹&#xff0c;就能够看到 FreeRTOS 内核的文件&…

使用Jupyter Notebook进行数据科学项目

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…

火山引擎VeDI数据服务平台:在电商场景中,如何解决API编排问题?

01 平台介绍 数据服务平台可以在保证服务高可靠性和高安全性的同时&#xff0c;为各业务线搭建数据服务统一出口&#xff0c;促进数据共享&#xff0c;为数据和应用之间建立了一座“沟通桥梁”。 同时&#xff0c;解决数据理解困难、异构、重复建设、审计运维困难等问题&#x…

C#进阶1

C#进阶1 本文章主要介绍C#的进阶知识&#xff0c;如反射&#xff0c;特性.... 参考视频链接 原码 文章目录 C#进阶1反射步骤泛型反射调用方法 获取属性 特性特性的定义步骤扩展枚举练习 反射 在 C# 中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&a…

【深度学习】合合信息:生成式AI时代的内容安全与系统构建

生成式AI时代的内容安全与系统构建 一、生成式 AI 的发展现状二、图像内容安全问题2.1、举几个伪造数字内容的例子2.1.1、谣言检测2.1.2、欺诈图像识别2.1.3、伪造信息 2.2、伪造文档/证照检测应用场景2.2.1、目前图像篡改主要涉及以下几个场景 2.3、合合信息伪造文档/证照检测…

软件系统安全保证措施,质量保证措施方案(Word原件套用)

系统安全保证措施是构建稳固防御体系的核心&#xff0c;旨在全方位保障信息系统的安全性。以下是对这七项措施的简要概述&#xff1a; 一、身份鉴别&#xff1a;采用多种认证方式&#xff0c;如密码、生物识别等&#xff0c;确保用户身份的准确无误&#xff0c;防止非法入侵。 …

gozero--环境安装和api语法

文章目录 前言环境安装安装go ctl安装protoc安装go-zero安装etcd配置环境变量安装插件 二、api语法说明syntaxtypeserverservicedoc命令转换 前言 go-zero是go语言的微服务框架&#xff0c;微服务内容很多&#xff0c;我希望我这一篇可以绘制出完整的地图&#xff0c;帮助需要…

vue中el-table显示文本过长提示

1.el-table设置轻提示:show-overflow-tooltip“true“&#xff0c;改变轻提示宽度

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版&#xff0c;就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标&#xff0c;点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…

sublime可以写python吗

首先你需要安装一个Sublime Text&#xff08;http://www.sublimetext.com/&#xff09;和一个Python&#xff08;https://www.python.org/downloads/&#xff09;&#xff0c; 接下来打开Sublime Text&#xff1a; 1、如下图所示&#xff0c;点击菜单栏中的Tools —> Buil…

初始Docker

概述&#xff1a; 容器&#xff0c;作为云原生技术的重要组成部分&#xff0c;与虚拟机一样&#xff0c;均属于虚拟化技术的范畴。然而&#xff0c;容器技术以其独特的优势&#xff0c;在虚拟化领域中脱颖而出。与虚拟机不同&#xff0c;容器能够摆脱操作系统的束缚&#xff0…

MATLAB函数,用于计算平均误差、误差最大值、标准差、均方误差、均方根误差

文章目录 源代码使用示例:计算公式1. 平均误差 (Mean Error, ME)2. 误差最大值 (Maximum Error, ME)3. 标准差 (Standard Deviation, SD)4. 均方误差 (Mean Squared Error, MSE)5. 均方根误差 (Root Mean Squared Error, RMSE) 总结 以下是一个MATLAB函数&#xff0c;用于计算常…

Axure设计之左右滚动组件教程(动态面板)

很多项目产品设计经常会遇到左右滚动的导航、图片展示、内容区域等&#xff0c;接下来我们用Axure来实现一下左右滚动的菜单导航。通过案例我们可以举一反三进行其他方式的滚动组件设计&#xff0c;如常见的上下滚动、翻页滚动等等。 一、效果展示&#xff1a; 1、点击“向左箭…

软考攻略/超详细/系统集成项目管理工程师/基础知识分享19

7.1 系统集成基础&#xff08;掌握&#xff09; 系统集成一般可以分为软件集成、硬件集成、网络集成、数据集成和业务应用集成等。 1、系统集成概念理解 软硬件系统集成是一种系统的思想和方法&#xff0c;它虽然涉及软件和硬件等技术问题&#xff0c;但绝不仅仅是技术问题 软硬…

数据库Redis篇

系列文章目录 第一章 C/C语言篇第二章 计算机网络篇第三章 操作系统篇第四章 数据库MySQL篇第五章 数据库Redis篇第六章 场景题/算法题第七篇 常见HR问题篇 本系列专栏&#xff1a;点击进入 后端开发面经 关注走一波 秋招阶段&#xff0c;面过很多大中小厂&#xff0c;积攒了…

SpringAOP技术

目录 一、概念引入 1.引入依赖 2.工具类 3.实体类 4.持久层实现类 5.业务层实现类 6.配置文件 7.测试类 8.运行 查看数据库&#xff1a; 9.现在如果转账过程中出现异常 AccountServiceImpl(模拟异常) 再运行&#xff1a; 查看数据库&#xff1a; 10.现在做事务…