理解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.rhkb.cn/news/460371.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker:容器化和虚拟化

虚拟化 虚拟化是一种资源管理技术&#xff0c;它将计算机的各种实体资源&#xff08;如CPU、内存、磁盘空间、网络适配器等&#xff09;予以抽象、转换后呈现出来&#xff0c;并可供分割、组合为一个或多个电脑配置环境。这些资源的新虚拟部分是不受现有资源的架设方式、地域或…

如何有效提升MySQL大表分页查询效率(本文以一张900万条数据体量的表为例进行详细解读)

文章目录 1、提出问题1.1 问题测试 2、解决问题&#xff08;三种方案&#xff09;2.1、方案一&#xff1a;查询的时候&#xff0c;只返回主键 ID2.2、方案二&#xff1a;查询的时候&#xff0c;通过主键 ID 过滤2.3、方案三&#xff1a;采用 elasticSearch 作为搜索引擎 3、总结…

DGUS屏使用方法

1、DGUS工程下载 迪文DGUS屏的所有硬件参数和资料下载&#xff0c;都是通过屏上的SD/SDHC接口来完成的&#xff0c;文件必须使用FAT32文件格式。第一次使用SD卡前&#xff0c;推荐先格式化一次&#xff0c;流程如下&#xff1a; 1、 右键单击SD卡&#xff0c;在弹出来的菜单中选…

设计产品宣传册没头绪?推荐一个超多产品宣传册、画册的案例网站

在当今市场竞争激烈的背景下&#xff0c;产品宣传册和画册是企业宣传的重要手段之一。一本独具匠心的宣传册&#xff0c;不仅能够准确传达产品特点&#xff0c;还能吸引潜在客户&#xff0c;提升品牌形象。然而&#xff0c;设计一本优秀的宣传册并非易事&#xff0c;许多设计师…

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求&#xff1a;批量注册5个用户&#xff0c;从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果

【网页布局技术】项目五 使用CSS设置导航栏

《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1&#xff0e;合理利用display:block属性2&#xff0e;利用margin-bottom设置间隔效果3&#xff0e;利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…

基于LangChain构建安全Agent应用实践(含代码)

概述&#xff1a;本文基于langchain和Cyber Security Breaches数据集构建Agent&#xff0c;并基于该Agent实现了数据分析、趋势图输出、预测攻击态势三个功能&#xff0c;最后给出Agent在安全领域应用的三点启示。 前提&#xff1a; 1、拥有openai API KEY&#xff1b;&#…

机器学习-决策树

登录后复制 import numpy as np import matplotlib.pyplot as plt from sklearn import datasetsiris datasets.load_iris() X iris.data[:,2:] y iris.target plt.scatter(X[y0,0], X[y0,1]) plt.scatter(X[y1,0], X[y1,1]) plt.scatter(X[y2,0], X[y2,1]) plt.show() 1.2.…

为什么大模型都是Decoder-only结构?

扫一扫下方&#xff0c;获取更多面试真题的集合 在探讨当前大型语言模型&#xff08;LLM&#xff09;普遍采用Decoder-only架构的现象时&#xff0c;我们可以从以下几个学术角度进行分析&#xff1a; 注意力机制的满秩特性&#xff1a;Decoder-only架构采用的因果注意力机制&am…

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…

北京迅为iTOP-LS2K0500开发板快速使用编译环境虚拟机Ubuntu基础操作及设置

迅为iTOP-LS2K0500开发板 迅为iTOP-LS2K0500开发板采用龙芯LS2K0500处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;架构&#xff0c;片内集成64位LA264处理器核、32位DDR3控制器、2D GPU、DVO显示接口、两路PClE2.0、两路SATA2.0、四路USB2.0、一路…

电子电气架构 --- 车载芯片现状

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

MySQL分层结构由哪些组成?

1、MySQL分层结构由哪些组成&#xff1f; MySQL按照功能模块可以分为3层&#xff1a;连接层、服务层和存储引擎层。 连接层位于Server服务层的最外层&#xff0c;负责与客户端的直接交互&#xff0c;从功能上单独划分一层更合适。 不同的存储引擎在存储层有不同的实现&#x…

Vue3入门--[vue/compiler-sfc] Unexpected token, expected “,“ (18:0)

新手小白学习Vue–入门就踩坑系列 问题描述 创建了一个Person.vue&#xff0c;保存后直接报错&#xff1a; [plugin:vite:vue] [vue/compiler-sfc] Unexpected token, expected "," (18:0) 在网上搜了半天也没找到原因&#xff0c;最后还得靠自己&#xff0c;现将解…

【宠粉赠书】大模型项目实战:多领域智能应用开发

在当今的人工智能与自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;凭借其强大的生成与理解能力&#xff0c;正在广泛应用于多个实际场景中。《大模型项目实战&#xff1a;多领域智能应用开发》为大家提供了全面的应用技巧和案例&#xff0c;帮助开发者深…

java:入门基础(1)

练习一&#xff1a;文字版格斗游戏 需求: ​ 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#xff09;&#xff0c;这些信息就应该被确定下来。 举例&#xff1a; ​ 程序运行之后…

Apache Paimon介绍

目录 背景 诞生 应用场景 实时数据分析与查询 流批一体处理 低成本高效存储 具体业务场景示例 总结 系统架构 存储层 元数据管理 计算层 数据摄入和输出 查询优化 扩展性和可靠性 生态系统集成 总结 核心概念 表&#xff08;Table&#xff09; 模式&#xf…

书生实战营第四期-第三关 Git+InternStudio

一、任务1: 破冰活动&#xff1a;自我介绍 1.fork项目到自己的账号下 2. 配置git并克隆项目到InternStudio本地 3.创建分支 4.创建自己的介绍文件 5.提交更改分支 6.推送分支到远程仓库 这里推送时会报错 问题解决&#xff1a;将密码换成access token 7.检查提交内容 分支…

【商汤科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

2-134 基于matlab的图像边缘检测

基于matlab的图像边缘检测&#xff0c;采用六种算子(分别是gabor、拉普拉斯、priwitt、robert、sobel、wallis微分算子&#xff09;&#xff0c;对图象进行边缘检测比较&#xff0c;输出边缘检测结果。可对比效果优劣。程序已调通&#xff0c;可直接运行。 下载源程序请点链接…