简单了解一下 TypeScript 的泛型

在 TypeScript (TS) 中,泛型是一个强大且灵活的工具,用于编写具有更高可复用性和类型安全性的代码。泛型允许我们在声明时将类型作为参数传入,使函数、接口和类能在不同的数据类型下复用,而无需重新编写逻辑。

1. 泛型的基本语法

泛型的基本语法是在函数、接口、类等结构后添加尖括号 <>,并指定一个类型参数(通常用大写字母如 T 表示)。

🌰:

function identity<T>(arg: T): T {return arg;
}

这里 T 是泛型类型,它表示一个占位符,可以是任何类型。函数 identity 接受一个参数 arg,其类型是 T,并返回相同类型的 T。当我们调用时,可以指定具体类型,如: identity<string>("Hello")。

2. 泛型在函数中的使用

在函数中,泛型可以用来定义参数返回值的类型,从而提高代码的灵活性和可复用性。

一个经典的 🌰 是数组的泛型方法:

function logArray<T>(arr: T[]): T[] {console.log(arr);return arr;
}

logArray 接收一个类型为 T 数组的参数,并返回该数组,T 可以是任意类型。通过这种方式,我们可以传入 string[]、number[] 等不同类型的数组,而不需要为每种类型写单独的函数。

3. 泛型在接口中的应用

泛型在接口中使用时,可以使接口支持不同的类型数据。

🌰,在定义一个具有 value 属性和 getValue 方法的接口时,可以使用泛型来灵活指定 value 的类型:

interface Box<T> {value: T;getValue(): T;
}
const stringBox: Box<string> = {value: 'Hello',getValue() {return this.value;},
};
const numberBox: Box<number> = {value: 18,getValue() {return this.value;},
};

Box<T> 接口可以适用于任何类型的 value,如 string、number,甚至是自定义类型。

4. 泛型在类中的应用

泛型在类中也有广泛的应用,特别是在需要处理不同类型的集合、数据结构时。

🌰:

class Stack<T> {private items: T[] = [];push(item: T) {this.items.push(item);}pop(): T | undefined {return this.items.pop();}
}

Stack 类使用了泛型 T,从而可以创建不同类型的栈,如 Stack<number> 或 Stack<string>。

5. 泛型约束(Constraints)

在某些情况下,我们可能希望限制泛型参数的类型范围,可以通过泛型约束实现这一点。

🌰,使用 extends 关键字来约束泛型类型必须具有某些属性或实现某个接口:

interface LengthType {length: number;
}
function logLength<T extends LengthType>(arg: T): T {console.log(arg.length);return arg;
}

logLength 函数的泛型参数 T 被约束为具有 length 属性的类型,这意味着只能传入具有 length 属性的对象,例如数组或字符串。

6. 多个泛型参数

有时一个泛型类型参数无法满足需求,此时可以使用多个泛型参数。

🌰:

function pair<T, U>(a: T, b: U): [T, U] {return [a, b];
}
pair(1, 1);
pair(1, '1');
pair('1', true);

pair 函数中,T 和 U 是两个泛型参数,允许我们将任意类型的两个值组合成一个元组。

7. 泛型的默认类型

TypeScript 支持为泛型提供默认类型,这样在没有指定类型时可以使用默认值:

🌰:

function createArray<T = number>(length: number, value: T): T[] {return Array(length).fill(value);
}const arr = createArray(3, 5); // 推断 T 为 number
const strArr = createArray<string>(3, 'Hello'); // 显式指定 T 为 string

createArray 函数中,设置 T 默认类型 number,这样如果调用时不指定类型,T 将默认为 number。

8. 泛型工具类型(Utility Types)

TypeScript 提供了一些内置的工具类型,可以用于处理泛型类型。例如:

- Partial<T>:将类型 T 中的所有属性变成可选。

- Readonly<T>:将类型 T 中的所有属性变为只读。常用于防止对象被修改的情况。

interface User {id: number;name: string;age: number;
}
type PartialUser = Partial<User>; // { id?: number; name?: string; age?: number; }
const user1: PartialUser = { name: 'Alice' }; // 只需要部分属性
const user2: PartialUser = {}; //也可以一个都不写
const user3: Readonly<User> = { id: 1, name: 'Alice', age: 30 }; // { readonly id: number; readonly name: string; readonly age: number; }
// user3.age = 31; // 错误:因为 user 是只读的
// const user4: Readonly<User>; // 'const' declarations must be initialized. 必须初始化 const 声明。

- Record<K, T>:将键类型为 K 的所有键映射到类型 T 的值。K 必须是字符串或字符串字面量的联合类型。常用于创建对象映射或字典。

type Role = 'admin' | 'user' | 'guest';
type Permission = Record<Role, boolean>; // 表示每个角色是否具有某种权限。const permissions: Permission = {admin: true,user: false,guest: false,
};

- Pick<T, K>:从类型 T 中选择一些属性构成新的类型。

- Omit<T, K>:从类型 T 中剔除一些属性构成新的类型。

interface User {id: number;name: string;age: number;
}
type UserPreview = Pick<User, 'id' | 'name'>;
const userPreview: UserPreview = { id: 1, name: 'Alice' }; // 只包含 id 和 nametype UserWithoutAge = Omit<User, "age">;
const userWithoutAge: UserWithoutAge = { id: 1, name: "Alice" }; // age 属性被去除

9. 泛型的优势与趋势

1、可复用性:泛型允许编写更通用的代码,减少重复,提高可维护性。

2、类型安全:相比于 any,泛型提供了明确的类型约束,能够在编译时捕获错误,提升代码的可靠性。

3、适用性广:泛型在函数、接口、类、工具类型中均可使用。

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

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

相关文章

从 PyQt5 窗口闪退问题看 Python 垃圾回收与消息机制

前言 此篇文章源于知乎上的一个问题&#xff0c;使用 PyQt5 编写 GUI 程序时&#xff0c;新创建的界面会闪退&#xff0c;本篇文章仅作记录以防以后忘记。 问题代码 import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QPushButtonclass Main(QMainWindow):d…

java两个线程的通信/指令重排

目录 1.线程通信 2.指令重排 1.线程通信 前段时间面试笔试题&#xff0c;手写两个线程之间的通信。 问题回顾&#xff1a; 一个生产者&#xff0c;一个消费者&#xff0c;一个桌子媒介。两个线程分别是消费者和生产者。流程是生产者生产一个件商品&#xff0c;通知消费者消…

建立用邻接矩阵表示的无向图

建立用邻接矩阵表示的无向图 #include<stdio.h> #define NUM 100 typedef struct {char vexs[NUM];int edges[NUM][NUM];int n,e; }MGraph; void CreateMGraph(MGraph *G) {int i,j,k;printf("请输入顶点数和边数:");scanf("%d,%d",&G->n,&a…

大模型微调技术 --> LoRA 系列之 AdaLoRA

AdaLoRA 1.摘要 之前的微调方法(如低秩更新)通常将增量更新的预算均匀地分布在所有预训练的权重矩阵上&#xff0c;并且忽略了不同权重参数的不同重要性。结果&#xff0c;微调结果不是最优的。 为了弥补这一差距&#xff0c;我们提出了AdaLoRA&#xff0c;它根据权重矩阵的…

革新网络管理:拉线网套技术引领行业新趋势

根据QYResearch调研团队的最新力作《全球拉线网套市场报告2023-2029》预测&#xff0c;到2029年&#xff0c;全球拉线网套市场的规模有望达到11.7亿美元&#xff0c;且在未来几年内&#xff0c;将以3.5%的复合年增长率&#xff08;CAGR&#xff09;持续扩张。 在全球范围内&…

HTB:Devel[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What is the name of the service is running on TCP port 21 on the target machine? 使用nmap对靶机TCP端口进行开放扫描 2.Which basic FTP command can be used to upload a single file onto the server? 尝试匿名连接至靶机FTP服…

Hadoop集群的高可用(HA)-(2、搭建resourcemanager的高可用)

第一步&#xff1a;检查mapred-site.xml &#xff0c;里面只有yarn配置和historyServer的配置&#xff0c;不需要修改 第二步&#xff1a;修改yarn-site.xml <?xml version"1.0"?> <!-- Licensed under the Apache License, Version 2.0 (the "Lic…

golang笔记

golang笔记 一、内存逃逸 本应在栈中内存,被分配到了堆中 1 返回指针对象 在外部被使用 2 reutrn 函数 使用了上面方法的敞亮 3 入参是interface{} 动态参数 4 make超过栈大小 -gcflags"-m"查看分配内存信息 返回变量vs返回指针 返回变量, 会多一步复制变量, 返回…

纹理分析——统计分析方法

一. 灰度共生矩阵法(Gray Level Co-occurrence Matrix, GLCM ) 灰度共生矩阵又称为灰度空间相关矩阵&#xff0c;是通过研究灰度的空间相关特性来描述纹理的常用方法。&#xff08;也称为联合概率矩阵&#xff09;它作为传统的图像纹理分析方法已广泛应用于数字图像处理的许多…

IT维修记录表导入接口的思路

上篇文章讲了IT设备信息表的导入接口的思路&#xff0c;这篇文章趁热打铁&#xff0c;把IT维修记录表的导入接口的思路给说一下。 首先我们要知道IT维修记录表的数据是什么来的&#xff1f;这个问题必须要搞懂&#xff0c;不搞懂的话对接下来的思路其实是不利的。IT维修记录表…

场景解决方案丨迎战电商大促,企业管理跟踪驾驶舱助力中小企业打赢决胜之战

该方案已沉淀为➡️订单物流信息跟踪模板&#xff0c;点击&#x1f517;即可体验 随着互联网技术的发展和市场经济的变化&#xff0c;各行业的线上竞争愈发激烈。一方面&#xff0c;互联网平台凭借便捷的服务和丰富的产品吸引了大量客户&#xff1b;另一方面&#xff0c;复杂多…

WebRTC 环境搭建

主题 本文主要描述webrtc开发过程中所需的环境搭建 环境&#xff1a; 运行环境&#xff1a;ubuntu 20.04 Node.js环境搭建 安装编译 Node.js 所需的依赖包: sudo apt-get update sudo apt-get install -y build-essential libssl-dev 下载 Node.js 源码: curl -sL htt…

Python从入门到高手7.5节-实现冒泡排序算法

目录 7.5.1 排序算法简介 7.5.2 冒泡排序算法原理 7.5.3 冒泡排序算法实现 7.5.4 永不放弃 7.5.1 排序算法简介 所谓排序&#xff0c;是指将数据集合中的元素按从小到大的顺序进行排列&#xff0c;或按从大到小的顺序进行排列。 前者称为升序排序&#xff0c;后者称为降序…

vue-quill-editor富文本编辑器

效果图&#xff1a; 1、下载安装vue-quill-editor npm install vue-quill-editor --save图片缩放、拖拽 npm install quill-image-drop-module -S //允许粘贴图像并将其拖放到编辑器中。 npm install quill-image-resize-module -S //允许调整图像大小<template>&…

TCP是怎样工作的网络拥塞控制理论和算法部分记录

参考资料 https://github.com/ituring/tcp-book 流量控制、窗口控制和拥塞控制的关系 流量控制、窗口控制和拥塞控制的关系如图所示 窗口控制是上层的概念&#xff0c;核心思路是基于滑动窗口技术传输数据。而确定发送窗口大小的方法有流量控制和拥塞控制两种 流量控制&…

NVR管理平台EasyNVR多个NVR同时管理对接天翼云云存储的一些关键信息和优势

在视频监控领域&#xff0c;随着技术的不断进步&#xff0c;存储方式的选择变得尤为重要。传统的本地存储方式受限于硬件容量&#xff0c;而云存储则以其强大的数据处理能力和弹性扩展性&#xff0c;成为视频数据存储的理想选择。NVR管理平台EasyNVR作为一款领先的视频汇聚与管…

饲料加工机器设备由搅拌机粉碎机颗粒机组成

饲料加工机器设备在现代养殖业中扮演着至关重要的角色&#xff0c;它们不仅提高了饲料的生产效率&#xff0c;还优化了饲料的营养价值。其中&#xff0c;饲料粉碎机、搅拌机和颗粒机是饲料加工流程中的三大核心设备。 想象一下&#xff0c;一把把粗糙的原料&#xff0c;在粉碎…

oracle数据坏块处理(二)-逻辑坏块重新格式化处理

1、问题描述 在使用duplicate搭建DG时报错 包括rman copy&#xff0c;rman备份 2、问题分析 由于数据文件逻辑坏块导致物理备份不能正常进行。 使用rman检查数据文件47 SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents WHERE file_id 47 a…

在IDEA使用arthas实现jar包方法耗时统计

1.背景 对于依赖jar包中的方法内部耗时统计&#xff0c;传统的手写StopWatch不适用&#xff0c;这儿采用arthas统计。 官网文档比较详细&#xff0c;trace | arthas 使用版本&#xff1a; arthas-boot version: 4.0.2 IntelliJ IDEA 2023.3.3 2.使用介绍 2.1.启动需要检…

用于图像识别的判别图正则化技术

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月8日13点32分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17210272021224&uid64a84f9640714755a…