TypeScript中泛型函数

一.概览

此前,对泛型有了整体的概览,详见TypeScript中的泛型,后面的系列会详细地介绍TypeScript的泛型。此篇文章主要介绍泛型函数

二. 泛型函数

泛型是类型不明确的数据类型,在定义时,接收泛指的数据类型(不知道具体是什么类型),在使用时,指定明确的数据类型的一种给定类型的方式。

泛型定义的位置:

  1. 函数声明: 写在函数名后面;
  2. 函数表达式: 写在表达式最前面

泛型调用的位置
在函数名后面跟泛型
传入具体的数据类型![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/70597a0664884784b3270b4e7e35e70a.png

1.泛型函数的引入具体是为了解决什么问题呢?

举个例子

function getSplitValue(value: string[],type: string):string {return value.join(type)
}function getSplitValue2(value: number[],type: string):string {return value.join(type)
}getSplitValue(['1','2','3'],',')
getSplitValue2([1,2,3],',')

问题:两个函数内部的逻辑完全一样,但由于传递参数的类型不同,导致了不得不定义两个函数去处理两个不同类型的数组

解决方案:用一种类型兼容两种不同类型的数组

第一种方法,可以使用any

value: any[]

缺点:如果想在使用函数时明确数组元素类型时,any就不适合了,用any会使约束变小

第二种方法: 使用泛型

function getSplitValue3<E>(value: E[],type: string):string {return value.join(type)
}const aa = getSplitValue3<string>(['a','b','c'],',')
const bb = getSplitValue3<number>([1,2,3],',')
console.log(aa) // 'a,b,c'
console.log(bb) // '1,2,3'

最小范围为any的场景,基本上都可以使用泛型

2. 泛型函数复用

type TypePlus<T> = (a: T, b: T) => T
type TypeNumberPlus<T,U> = (a: T, b: U) => stringconst plusNumber: TypePlus<number> = (a,b) => {return a + b
}const plusString: TypePlus<string> = (a,b) => {return a + b
}
const numberPlus: TypeNumberPlus<number,string> = (a,b) => {return a + b
}
console.log(plusNumber(1,2))
console.log(plusString('1','2'))
console.log(numberPlus(9,'aa'))

可以将公共部分封装起来,有点像js中的柯里化。

3. 泛型约束

举个例子

function plusNumber(a: number,b:number):number {return a + b
}

指定特定类型,正常编译

function plusNumber<T>(a: T,b:T):number {return a + b
}

指定泛型,编译报错
编译报错:运算符“+”不能应用于类型“T”和“T”

报错原因:它们可以是任何类型(由泛型 T 表示),然后返回这两个参数的和。
但是,有一个问题在于,这个函数不能正确处理所有类型的参数。当输入参数的类型不是数字或时,尝试将它们相加将会导致运行时错误,所以需要约束

function plusNumber<T extends number>(a: T, b: T): number {  return a + b  
}
plusNumber<number>(1,2)

类似的例子还有这种

function getLength<T>(value: T) {return value.length
}

编译报错:类型“T”上不存在属性“length”

报错原因:泛型T作为getLength的泛型参数的类型范围大了,某些数据类型是没有length属性,导致无法进行length的访问

可以用泛型约束来修复

function getLength<T extends {length: number}>(value: T) {return value.length
}

注意:函数约束是为了让范围的可代表类型的范围缩小,并不是给泛型指定类型。

可迭代的对象,才可以进行对应的数据转换


interface IPrev<U> {
[key:number]:U
}function createObject<T extends Iterable<any>>(value: T) {
return [...value].reduce((prev:IPrev<U>,current:U,index:number) =>{
prev[index] = current
return prev
},{})}

4. 泛型的联合类型

举个例子

function mergeArr<E> (arr1: E[],arr2:E[]) {return [...arr1,...arr2]
}const arr = mergeArr<number>([1,2,3],['a','b','c'])

类型推断: 根据第一个实参[1,2,3]推断E为number,所以[‘a’,‘b’,‘c’]里面的值为字符串的时候会有编译报错
编译报错:不能将类型“string”分配给类型“number”。

这个时候就可以使用联合类型

type typeValue = string | numberfunction mergeArr<E> (arr1: E[],arr2:E[]) {return [...arr1,...arr2]
}const arr = mergeArr<typeValue>([1,2,3],['a','b','c'])

三.总结

泛型的好处:

  1. 可以在不明确类型的时候,使用泛型占位
  2. 可以在调用函数是,对函数的参数进行类型的约束

类型参数化是泛型的特征:

  1. 定义时,传入类型参数(泛型)
  2. 调用时,传入实际类型

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

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

相关文章

易点易动:颠覆固定资产用量管理,实现高效精准的企业固定资产管理

固定资产用量管理是企业日常运营中不可或缺的一环。然而&#xff0c;传统的人工管理方式面临着时间成本高、数据不准确、难以监控等问题。为了解决这些挑战&#xff0c;易点易动应运而生&#xff0c;它是一款先进的资产管理系统&#xff0c;能够帮助企业实现高效精准的固定资产…

【Java项目管理工具】Maven

Maven 文章目录 Maven一、简介二、安装和配置三、GAVP四、IDEA Maven Java Web工程五、插件、命令、生命周期六、依赖配置七、构建配置八、依赖传递与依赖冲突九、Maven工程继承和聚合关系9.1 工程继承关系9.2 工程聚合关系 十、Maven私服10.1 Nexus下载安装10.2 Nexus上的各种…

案例054:基于微信的追星小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

linux的权限741

741权限 在 Linux 中&#xff0c;文件和目录的权限由三组权限来定义&#xff0c;分别是所有者&#xff08;Owner&#xff09;、所属组&#xff08;Group&#xff09;和其他用户&#xff08;Others&#xff09;。每一组权限又分为读&#xff08;Read&#xff09;、写&#xff0…

c++函数模板STL详解

函数模板 函数模板语法 所谓函数模板&#xff0c;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体指定&#xff0c;用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替&#xff0c;不必定义多个函数&#xf…

Java安全之Commons Collections5

CC5分析 import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransfo…

基于ssm绿色农产品推广应用网站论文

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

Cloudways和SiteGround哪个更好?

当提及WordPress托管服务提供商时&#xff0c;人们常常会拿Cloudways和SiteGround做比较。Cloudways作为备受欢迎的品牌&#xff0c;而SiteGround则是业界的老牌巨头。它们之间主要的区别在于服务范围。SiteGround提供广泛的托管服务&#xff0c;包括Web托管、WordPress托管、W…

Android 11.0 屏蔽保护听力对话框

Android 11.0 屏蔽保护听力对话框 最近收到客户反馈提到当设备音量调高到一定程度时会弹出提示保护听力的对话框&#xff0c;影响了操作使用&#xff0c;需要将弹出的提示保护听力对话框屏蔽掉&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packag…

Flex布局 实现元素排列 4列变2列?

电脑版显示为一行有四列. 手机版显示为一行两列 thinkphp 的 html <section class"nutshell"style""><div class"grid"><div class"section-title center anim">{$typecont.enname}</div><div class"…

『VUE3后台—硅谷甄选』

一、准备前期 pnpm create vite

修改错误的代码和改正错误的人生一样重要

修改错误的代码和改正错误的人生一样重要 在学习和生活中&#xff0c;经常会遇到错误的代码。无论是语法错误、逻辑错误或是其他错误&#xff0c;这些错误都会导致程序无法正常运行。修改错误的代码是每一位开发者都要面对的重要任务&#xff0c;其实我们修改错误的人生又何尝不…

【【RGB LCD 彩条显示实验 ---1】】

RGB LCD 彩条显示实验 —1 TFT-LCD 的全称是 Thin Film Transistor-Liquid Crystal Display&#xff0c;即薄膜晶体管液晶显示屏&#xff0c;它显示的每个像素点都是由集成在液晶后面的薄膜晶体管独立驱动&#xff0c;因此 TFT-LCD 具有较高的响应速度以及较好的图像质量。 我…

一对一单聊

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

19、XSS——HTTP协议安全

文章目录 一、Weak Session IDs(弱会话IDs)二、HTTP协议存在的安全问题三、HTTPS协议3.1 HTTP和HTTPS的区别3.2 SSL协议组成 一、Weak Session IDs(弱会话IDs) 当用户登录后&#xff0c;在服务器就会创建一个会话&#xff08;Session&#xff09;&#xff0c;叫做会话控制&…

【JavaScript手撕代码】flat、push、filter、map、repeat

flat 借助上面递归concat扁平化即可 Array.prototype.myflat function(deep1) {let res []deep--for(const element of this) {if(Array.isArray(element) && deep) {res res.concat(element.myflat(deep))}else{res.push(element)}}return res }push 根据我们对…

在线客服的工作职责有哪些?

信息时代发展的脚步越来越快&#xff0c;在线客服成为了许多企业不能缺失的一部分。他们扮演着与客户沟通的桥梁&#xff0c;为客户提供及时高效又专业的服务。那么在线客服的工作职责究竟有哪些呢&#xff1f; 用心接待客户咨询 在线客服的首要职责是接待客户的咨询。无论是网…

FAQ:Constructors篇

文章目录 What’s the deal with constructors?Is there any difference between List x; and List x();?Can one constructor of a class call another constructor of the same class to initialize the this object?Is the default constructor for Fred always Fred::Fr…

urllib爬虫 应用实例(三)

目录 一、 ajax的get请求豆瓣电影第一页 二、ajax的get请求豆瓣电影前十页 三、ajax的post请求肯德基官网 一、 ajax的get请求豆瓣电影第一页 目标&#xff1a;获取豆瓣电影第一页的数据&#xff0c;并保存为json文件 设置url&#xff0c;检查 --> 网络 --> 全部 -…

zedbox 实现配置 yolov5

Stereolabs 的 ZED Box 是一款由 NVIDIA Jetson™ 提供支持的紧凑型网关&#xff0c;用于在移动和现场情况下挑战 AIoT&#xff08;物联网&#xff09;。它旨在将空间感知和理解带到边缘&#xff0c;并聚合、处理和分析来自 3D 传感器和设备的数据。 相关内容 1.win10下 cud…