使用TypeScript范型提升代码复用性和安全性

什么是TypeScript范型

TypeScript 的范型(Generics)是一种创建可重复使用的组件的方式,这种组件可以对多种数据类型进行操作。

范型本质上是为参数化的类型系统提供了工具,它提供了一种方法,能让你在定义函数、接口或类时不具体指定类型,而是在使用时再明确类型。

普通类型和范型最主要的区别

  • 普通类型在编码阶段就已经确定了数据类型,对于不同类型的处理需要写多个函数或者类;
  • 范型则使用一种动态的方式,不断变化以适应不同的需求,使得你可以使用相同的函数或者类去处理不同类型的数据;

TypeScript 范型是如何工作原理

范型在函数、接口以及类中都可以应用。以下以一个函数为例:

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

在此代码中,我们定义了一个名为 “getArgs” 的函数,接收一个类型为 “T” 的参数,并将这个参数直接返回。

类型 “T” 就是我们设定的范型,当使用这个函数的时候,就可以确定 “T” 的具体类型:

typescript复制代码
let output = getArgs<string>("hello");  // 类型设置为 string
console.log(output);  // 打印:hello

使用TypeScript范型创建可重用组件

范型的一大用途是创建可复用的组件。例如,我们可以用范型实现一个具有前后两个元素之间有序关系的链表:

class LinkedList<T> {private data: T[] = [];constructor(private compareFunc: (a: T, b: T) => number) {}add(item: T) {let index = this.data.length;while (index > 0 && this.compareFunc(this.data[index - 1], item) > 0) {this.data[index] = this.data[index - 1];index--;}this.data[index] = item;}get(index: number): T {return this.data[index];}
}

在此代码中,**LinkedList**类就可以针对任何具有顺序关系的类型进行操作。

实战训练

为了提高读者对范型的理解和熟练程度,这里附上了两道实战题目和答案:

题目1

实现一个范型函数,能够取出一个数组中的最小值。假设数组中的元素是可以直接比较大小的。

function minItem<T>(arr: T[]): T {return arr.reduce((prev, curr) =>  prev < curr ? prev : curr);
}

题目2

基于**LinkedList**类,实现一个字符链表类 CharLinkedList,字符的顺序关系由字母表决定。

class CharLinkedList extends LinkedList<string> {constructor() {super((a, b) => a.localeCompare(b));}
}

总结

总范型是 TypeScript 中的一个重要特性,作为 TypeScript 强大类型系统的一部分,它大大提升了代码的灵活性和安全性。

范型的主要优点在于其灵活性和高效性。通过范型,您可以避免因类型转换而引起的额外运算负担,并且通过类型检查,增强了代码的稳定性和健壮性。

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

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

相关文章

找不到msvcp120dll,无法继续执行代码的解决方法大全

当你尝试启动一个应用程序或游戏&#xff0c;并且遭遇到一个错误信息&#xff0c;告诉你“找不到msvcp120dll,无法继续执行代码”或者收到类似的提示&#xff0c;这说明你的操作系统中缺失了一个关键的动态链接库文件&#xff0c;即 msvcp120.dll。这种情况其实并不罕见&#x…

一文解析子网掩码和默认网关,成为网络设置达人

随着互联网的普及&#xff0c;越来越多的人开始接触并使用电脑和网络。然而&#xff0c;对于很多初学者来说&#xff0c;网络设置中的子网掩码和默认网关是两个相对陌生的概念。今天&#xff0c;我们就来深入解析这两个概念&#xff0c;让你轻松掌握网络设置技巧&#xff01; …

从功能测试到测试开发,薪资翻倍,我整理的全网最全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…

【快速应用开发】Blitz.js简介:Next.js的全栈框架

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Swift 周报 第四十一期

文章目录 前言新闻和社区2024 年 Swift Student Challenge 公布现推出超过 30 个新的开发者活动 提案正在审查的提案 Swift论坛话题讨论推荐博文关于我们 前言 本期是 Swift 编辑组整理周报的第四十一期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢…

【Python百宝箱】云上翱翔:Python编程者的AWS奇妙之旅

雲端箴言&#xff1a;用Python主持AWS管理交響樂 前言 随着云计算的普及&#xff0c;AWS&#xff08;Amazon Web Services&#xff09;成为了许多组织和开发者首选的云服务提供商。作为Python工程师&#xff0c;深入了解AWS管理工具和库对于高效利用云资源至关重要。本文将引…

【学习笔记】Java函数式编程01-Lambda表达式

文章目录 一、概述1.1 为什么学习函数式编程1.2 函数式编程思想1.2.1 概念1.2.2 优点 二、Lambda表达式2.1 概述2.2 核心原则2.3 基本格式2.3.0 小结2.3.1 案例一&#xff1a;匿名内部类写法:star2:**什么情况可以进行Lambda进行简化&#xff1f;** 2.3.2 案例二&#xff1a;In…

深度学习目标检测(2)yolov3设计思想

YOLOv3基础 YOLOv3算法基本思想可以分成两部分&#xff1a; 按一定规则在图片上产生一系列的候选区域&#xff0c;然后根据这些候选区域与图片上物体真实框之间的位置关系对候选区域进行标注。跟真实框足够接近的那些候选区域会被标注为正样本&#xff0c;同时将真实框的位置…

Qt获取屏幕DPI缩放比

获取屏幕缩放比 网上很多代码是用 logicalDotsPerInch 除以 96 来获取屏幕缩放比&#xff1a; // Windows 除以 96&#xff0c;macOS 除以 72 qreal factor window->screen()->logicalDotsPerInch() / 96.0; 当使能了缩放适配后&#xff0c;logicalDotsPerInch 值就不…

Sentinel 流量治理组件教程

前言 官网首页&#xff1a;home | Sentinel (sentinelguard.io) 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形…

macOS 开发 - MASShortcut

文章目录 关于 MASShortcut项目结构 快速使用源码学习检测是否有热键冲突处理 Event macOS 开发交流 秋秋群&#xff1a;644096295&#xff0c;V : ez-code 关于 MASShortcut MASShortcut 是一款快捷键管理工具&#xff0c;替代和兼容 ShortcutRecorder github : https://git…

Pytorch常用的函数(五)np.meshgrid()和torch.meshgrid()函数解析

Pytorch常用的函数(五)np.meshgrid()和torch.meshgrid()函数解析 我们知道torch.meshgrid()函数的功能是生成网格&#xff0c;可以用于生成坐标&#xff1b; 在numpy中也有一样的函数np.meshgrid()&#xff0c;但是用法不太一样&#xff0c;我们直接上代码进行解释。 1、两者…

最新消息丨OpenAI灰度测试GPT-4.5-turbo,快看看,你的版本是最新的吗?

刚刚&#xff0c;有朋友发来消息说&#xff1a;OpenAI 正在灰度测试它的最新模型——GPT-4.5-turbo。 于是&#xff0c;赶紧测了一下&#xff0c;发现果然如此。 相比于之前的 GPT-4-turbo&#xff0c;GPT-4.5-turbo 增强了6大能力。 分别是&#xff1a; √效率和性能&#x…

Redis哨兵源码分析

在Redis server启动过程中&#xff0c;实现了实例化和初始化 1、哨兵实例化过程&#xff0c;采用redis sentinel指令实例化还是redis server下的参数实例化--sentinel。 // 检查服务器是否以 Sentinel 模式启动 server.sentinel_mode checkForSentinelMode(argc,argv);/* Re…

分子生成工具 - ResGen 评测

ResGen 模型是浙江大学药学院侯廷军老师课题组2023年发表在nature machine intelligence期刊上文章Nature Machine Intelligence | Volume 5 | September 2023 | 1020–1030&#xff0c;题目为&#xff1a;《ResGen is a pocket-aware 3D molecular generation model based on …

java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

目录 1、检查项目中 JDK 的设置&#xff1a; 2、检查模块中 JDK 的设置&#xff1a; 3、检查Idea 中的SDK设置 4、检查 IDEA 中 JDK 的设置&#xff08;我出现的问题在这&#xff09;&#xff1a; 今天遇见了一个报错&#xff1a; 问题产生的原因是 JDK 版本太低&#xf…

从程序员到百万富翁,他的技能和智慧是关健

我要跟大家分享一个超级励志的故事&#xff01;&#x1f389;这个故事的主人公是一位普通的程序员&#xff0c;但他通过自己的努力和智慧&#xff0c;成功地实现了从平凡到非凡的飞跃&#xff0c;成为了一位百万富翁&#xff01;你们一定很好奇他是怎么做到的吧&#xff1f;别急…

【JAVA面试题】什么是深拷贝?什么是浅拷贝?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 一、解释 1. 深拷贝&#xff08;Deep Copy&#xff09;&#xff1a; 2. 浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1…

企业级“RAS”的数据平台如何炼成?

从“看报表”到“数据分析结果直接投入运营”&#xff0c;数字化正在深入企业经营&#xff0c;数据系统正在成为核心生产系统。相应的&#xff0c;企业对“作业挂了”、“系统崩了”、“算不出来”的容忍度越来越低——只有足够稳定、可靠、专业的数据系统&#xff0c;才能及时…

原生微信小程序中使用-阿里字体图标-详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…