ts 泛型基础介绍

泛型:指的是,在定义函数/接口/类型...时,不预先指定具体的类型,而是在使用的时候再指定类型限制的一种特性


当我们定义一个变量,但不确定其类型的时候,有两种解决方式:

  1. 方式1:使用any
    使用any定义时存在的问题:虽然已知道传入值的类型,但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势。
  2. 方式2:使用泛型
    泛型:在定义函数/接口/类型...时,不预先指定具体的类型,而是在使用的时候再指定类型限制的一种特性。

  1. 在函数中使用泛型
    使用方式:类似于函数传参,传什么数据类型,T就表示什么数据类型,使用时T也可以换成任意字符串
function test<T>(arg: T): T {console.log('泛型=', arg)return arg
}
test<number>(123456) // 返回值是number类型的123456
test<string | boolean>('hahahaha') // 返回值是string类型的hahahaha
test<string | boolean>(false)const test1 = <T>(arg: T): T => {console.log('泛型=', arg)return arg
}
const ret1 = test1<string>('Hello')
const ret2 = test1<number>(42)
const ret3 = test<number[]>([1, 2, 3])
  1. 在接口中使用泛型
interface Search {<T, Y>(name: T, age: Y): T // 注意:这里写法是定义的方法哦。。。。。。
}let fn: Search = function <T, Y>(name: T, id: Y): T {console.log(name, id)return name
}
fn('li', 11) // 编译器会自动识别传入的参数,将传入的参数的类型认为是泛型指定的类型

  1. 使用接口约束泛型
interface Person {zname: stringzage: number
}
function student<T extends Person>(arg: T): T {return arg
}
// 例子1:传入满足 Person 接口的对象
const person: Person = { zname: 'Alice', zage: 25 }
const result1 = student(person) // 返回类型为 Person// 例子2:传入满足 Person 接口的子类型的对象
class Student implements Person {zname: stringzage: numberconstructor(name: string, age: number) {this.zname = namethis.zage = age}
}
const studentObj = new Student('Bob', 30)
const result2 = student(studentObj) // 返回类型为 Student// 例子3:传入不满足 Person 接口的对象
const invalidObj = { zname: 'Charlie', zage: '20' } // 注意:zage 的类型错误
// const result3 = student(invalidObj); // 报错:类型 "{ zname: string; zage: string; }" 的参数不能赋给类型 "Person" 的参数// 例子4:传入不满足 Person 接口的对象,但使用类型断言绕过类型检查
// const invalidObj2 = { zname: 'Charlie', zage: '20' } as Person; // 使用类型断言
// const result4 = student(invalidObj2); // 返回类型为 Person

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

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

相关文章

2、ARM处理器概论

一、ARM处理器概述 1、ARM的含义 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义&#xff0c;一个公司的名称、一类处理器的通称、一种技术 ARM公司&#xff1a; 成立于1990年11月&#xff0c;前身为Acorn计算机公司主要设计ARM系列RISC处理器内核授权ARM内…

调整参数提高mysql读写速度

要提升MySQL的写入速度,您可以采取一些参数调整和优化措施,这些措施可以根据您的具体应用和环境进行调整。以下是一些常见的参数和优化建议: InnoDB存储引擎: 如果您使用的是InnoDB存储引擎,确保以下参数被设置得合理: innodb_buffer_pool_size:增加内存池大小,以便更多…

idea设置项目启动的JVM运行内存大小

idea设置项目启动的JVM运行内存大小 场景 在开发当中&#xff0c;idea默认服务启动要占用1G内存。其实每个项目本地开发和调试的时候&#xff0c;根本不需要1G内存&#xff0c;200M左右足以 如果在微服务体系下&#xff0c;那效果更明显&#xff0c;相同的内存可以启动更多的…

一代人有一代人的使命

一、前言 今天是9.18,对于全体中国人民来说是一个不应该被遗忘的日子,1931年9月18日,日本发动了9.18事变。 前辈们后来经过了艰苦卓绝的抵抗,经过12年的抗战,最后才取的抗日战争的胜利,可以说,今天的日子来之不易。 博主想说的是一代人有一代人的使命。100年前,先辈们…

人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

一、人脸修复算法 1.算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.c…

Java增强for循环(学习笔记)

Java增强for循环 主要用于数组或者集合的增强型for循环。 格式&#xff1a; for(声明语句&#xff1a;表达式){ 代码句子 } 声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块&#xff0c;其值与此时数组元…

java使用selenium自动化WebDriver等待

显式等待和隐式等待是WebDriver中两种常用的等待方式&#xff0c;它们都可以用来等待特定的条件满足后再继续执行代码。 显式等待&#xff08;Explicit Wait&#xff09;&#xff1a;使用WebDriverWait类来实现&#xff0c;可以根据特定条件等待元素出现、可见、可点击等。 示例…

使用Node构建私人代理池

在进行大规模数据采集时&#xff0c;经常会遇到网站反爬虫机制导致爬虫被封的问题。为了解决这个困扰&#xff0c;本文将向大家介绍如何利用Node.js构建私人代理池&#xff0c;提供稳定的代理&#xff0c;实现高效、可靠的爬虫操作。跟随本文一起学习&#xff0c;拥有解封爬虫的…

sentry安装self-hosted版,前端监控平台

一、下载self-hosted-23.7.2.tar.gz 二、解压 三、cd self-hosted-23.7.2然后执行./install.sh 四、查找python whereis python修改yum配置文件&#xff1a;vim /usr/bin/yum五、修改RUN apt-get update && apt-get install -y --no-install-recommends cron &…

9月15日上课内容 Zookeeper集群 + Kafka集群

Zookeeper 本章结构 Zookeeper 概述 Zookeeper 定义 *&#xff08;了解&#xff09; Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制 *****&#xff08;非常重要&#xff0c;需要掌握&#xff09; Zookeeper从设计模式…

检索技术核心学习总结

一、学习检索技术的必要性分析 &#xff08;一&#xff09;关键原因分析 学习检索技术&#xff08;Information Retrieval&#xff0c;IR&#xff09;具有多种重要的原因&#xff0c;特别是在今天信息爆炸的数字化时代。 总的来说&#xff0c;学习检索技术有助于提高信息处理…

x86平台运行arm64平台docker 镜像

本文介绍在x86服务器上安装qemu-aarch64-statick仿真器&#xff0c;以实现x86服务器可以运行docker或docker-compose镜像。 报错信息&#xff1a; x86服务器默认不能运行ARM平台镜像&#xff0c;会提示如下错误&#xff1a; WARNING: The requested images platform (linux/ar…

1400*C. No Prime Differences(找规律数学)

解析&#xff1a; 由于 1 不是质数&#xff0c;所以我们令每一行的数都相差 1 对于行间&#xff0c;分为 n、m之中有存在偶数和都为奇数两种情况。 如果n、m存在偶数&#xff0c;假设m为偶数。 如果都为奇数&#xff0c;则&#xff1a; #include<bits/stdc.h> using name…

(压缩PDF)Adobe Acrobat DC

需求 压缩PDF大小到2MB以下 方法 工具&#xff1a;Adobe Acrobat DC 1、简单方法&#xff1a;压缩 PDF&#xff0c;缩小 PDF 大小&#xff0c;使用 Adobe Acrobat DC 压缩 PDF。 - 卖五金的小贩的文章 - 知乎 意外的好用&#xff0c;不会压缩到太狠&#xff08;选了兼容Ac…

【Qt】QGroundControl入门2:下载、编译、错误处理、运行

1、源码下载 git clone https://github.com/mavlink/qgroundcontrol.git 2、下载依赖库 2.1 查看依赖库的github路径 cat .gitmodules[submodule "src/GPS/Drivers"]path = src/GPS/Driversurl = https://github.com/PX4/GpsDrivers.git [submodule "libs/m…

Google Guava精讲(一)-Guava是什么?能做什么?

https://mvnrepository.com/artifact/com.google.guava/guava 作为Java栈的测试工程师&#xff0c;在写代码时候会频繁遇到字符串处理、缓存、反射等问题&#xff0c;我们最常规的做法就是&#xff0c;为了使原生的JDK方法好用&#xff0c;通常是做了一层又一层封装&#xff0…

RK3588修改eth0和eth1,对调这两个网卡设备的名称

1、以太网卡的名称一般是ethX&#xff08;X可以是0&#xff0c;1&#xff0c;2&#xff0c;3…&#xff09;&#xff0c;一般我们的设备只有一个网卡&#xff0c;并且一般也不会改变它的网卡名称&#xff0c;所以不需要关注此问题&#xff0c;但是有一些设备有两三个网卡&#…

new/delete, malloc/free 内存泄漏如何检测

区别&#xff1a; 首先new/delete是运算符&#xff0c;malloc/free是库函数。malloc/free只开辟内存不初始化&#xff1b;new/delete及开辟内存也初始化。抛出异常的方式&#xff1a;new/delete开辟失败使用抛出bad_alloc&#xff1b;malloc/free通过返回值判断。malloc和new区…

el-table 翻页记住上页选项,包含回显选中的数据

需求为翻页记住上页选项,包含回显选中的数据,然后还能进行新增和取消勾选 首先element管网有提供及住翻页功能 所以可以根据官网提供的方法来改造 一定要做的操作就是清空一下选中的数据,否则不生效,this.$refs.selectTable.clearSelection(); 然后就是处理选中的数据,和原…

强强/视频SDK:VisioForge SDKs .Net 15.6.8 Crack

VisioForge 为软件开发人员提供视频捕获、编辑和播放解决方案 使用我们的开发人员软件&#xff0c;您可以开发用于从多种来源&#xff08;例如网络摄像头、IP 摄像机、摄像机或 PC 屏幕&#xff09;捕获视频的应用程序。视频可以保存为所有最流行格式的视频文件&#xff0c;例如…