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

news/2024/10/30 20:24:47/

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

泛型的基本概念

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

应用场景

1. 泛型函数

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

示例:交换两个值的位置
typescript">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. 泛型类

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

示例:创建一个通用的容器类
typescript">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. 泛型接口

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

示例:定义一个通用的键值对接口
typescript">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. 泛型类型别名

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

示例:定义一个通用的键值对类型
typescript">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 变量
typescript">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. 定义泛型函数
typescript">function createRef<T>(initialValue: T): ReturnType<typeof ref<T>> {return ref(initialValue);
}

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

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

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

3. 更新和访问 ref 变量
typescript">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.ppmy.cn/news/1543177.html

相关文章

Docker 部署 Java 项目实践

在当今的软件开发领域&#xff0c;容器化技术已经成为了一种趋势。Docker 作为一种流行的容器化平台&#xff0c;为开发者提供了一种便捷、高效的方式来部署和管理应用程序。对于 Java 项目而言&#xff0c;使用 Docker 进行部署可以带来许多好处&#xff0c;如提高部署效率、增…

vue打包的dist文件,再使用eletron打包为exe

1.下载eletron demo demo 2.npm install 2.1如遇443&#xff0c;使用eletron镜像专用源&#xff0c;参考链接 [eletron]RequestError: connect ETIMEDOUT 20.205.243.166:443&#xff0c;为eletron设置专用源。 3.在electron-quick-start-main下粘贴dist 4.再粘贴static/lo…

基于Django+Python的房屋信息可视化及价格预测系统设计与实现(带文档)

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…

BGP路径属性与路由反射器

前言 IBGP水平分割规则用于防止AS内部产生环路&#xff0c;在很大程度上杜绝了IBGP路由产生环路的可能性&#xff0c;但是同时也带来了新的问题&#xff1a;BGP路由在AS内部只能传递一跳&#xff0c;如果建立IBGP对等体全互联模型又会加重设备的负担。 BGP 路径属性 AS_Path …

为什么不建议使用黑帽SEO手法?

黑帽SEO&#xff0c;是指采用一些违反谷歌搜索引擎规则的手段&#xff0c;短期内提升排名的做法。很多不法SEO服务商&#xff0c;会通过隐藏文字、伪造内容、堆砌关键词、群发垃圾外链等方式&#xff0c;让网站在短时间内获得大量流量和排名。 虽然这种方式看似有效&#xff0c…

一些小细节代码笔记汇总

Python cv2抓取摄像头图片保存到本地 import cv2 import datetime, ossavePath "E:/Image/"if not os.path.exists(savePath):os.makedirs(savePath)cap cv2.VideoCapture(0) capture Falseif not cap.isOpened():print("无法打开摄像头")exit()while…

oracle获取中文拼音/WB

1.oracle获取中文拼音首字母 CREATE OR REPLACE FUNCTION FUNC_GET_PY(z varchar2) RETURN varchar2 ISpy varchar2(20); --与源字符对应的拼音码curr_no integer; --当前字符序号maxlen integer; --z(源字符串)的最大长度l_schar varchar2(100); --截取后的源字符…

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】&#xff0c;66.5k stars - 创建数学动画的 Python 框架二、【siyuan】&#xff0c;19.5k stars - 个人知识管理软件三、 【GetQzonehistory】&#xff0c;1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…