第五章 TypeScript泛型的介绍和使用

image.png

文章目录

  • 一、泛型
    • 初识泛型
    • 泛型用法
  • 二、断言

一、泛型

初识泛型

  • 一个函数,需要参数是 number 数据类型,返回值也是 number 数据类型
function fn(arg: number): number { // 代码忽略不计 
}
  • 又一个函数,需要参数是 string 类型,返回值也是 string 数据类型
function fn(arg: string): string {// 代码忽略不计
}
  • 我们发现,我们给函数的参数和返回值都进行了限制
    • 假设,如果两段代码的业务逻辑一样
    • 我们可以不可把两个函数写成一个
    • 需求:我传递的是 数字,返回值就是数字,传递的是 字符串,返回值就是 字符串
  • 思考过后,我们想到可以用 或( | )
function fn(arg: number | string): number | string {// 代码忽略不计
}
  • 看起来不错
  • 但是不能完全满足我们的需求
    • 参数 number 返回值 number
    • 参数 number 返回值 string
    • 参数 string 返回值 number
    • 参数 string 返回值 string
  • 以上四种情况都是可以的
  • 和我们预期的需求不一样
  • 我也可以写成 any 类型不就好了
function fn(arg: any): any { // 代码忽略不计 
}
  • 这样一来,好像对参数和返回值的限制又都没有了
  • 那么 TS 的意义好像不大了
  • 难道说用了 TS 以后,我们的代码反而不灵活了吗 ?
  • 来看下面一段代码
function fn<T>(arg: T): T { // 代码忽略不计 
}
  • 这个玩意看起来怪怪的,感觉认识但又不完全认识
  • 这里函数名后面的 “” 表示给该函数定义了一个泛型,就是预设了一个类型限制
  • 将来你调用这个函数的时候,来传递一个类型对函数进行约束
// 用 string 去填充预设
// 当前函数的参数必须是 string,返回值也必须是 string
fn<string>('hello')// 用 number 去填充预设
// 当前函数的参数必须是 number,返回值也必须是 number
fn<number>(100)
  • 在来思考我们一开始的需求,其实主要就是取决于调用的时候
  • 泛型,其实就是在定义阶段不预先指定具体类型,只是留下一个空位或者预设位置,当你使用的时候在决定使用什么具体的数据类型填充

泛型用法

  1. 函数泛型
    • 就是利用泛型限定函数的参数和返回值
function test <T>(arg: T): T{// ... 此处省略代码 10000 行return arg
}
test<number>(111) // 返回值是 number 类型
  • 也可以设置多个泛型标识符
function test <T, U>(arg1: T,arg2: U): [UT]{// ... 此处省略代码 10000 行return [ arg2,arg1 ]
} 
test<numberstring>(100'hello world')
  • 泛型标识符可以设置一个,也可以设置多个,用哪个字母无所谓
  1. 接口泛型
    • 在定义接口的时候,也可以使用泛型
interface User<T> {gender: T
}const p1: User<string> = {gender: '男'
}const p2: User<boolean> = {gender: true
}
  • 这样看起来,泛型是不是非常方便呢
  • 同样,也可以设置一个,也可以设置多个
// 制作一个方法的接口泛型
interface Search {<T, Y>(name: T, age: Y): T}let fn:Search = function <TY>(name: T, id: Y): T {// ... 此处省略代码 10000 行return name;
}
  1. 类泛型
    • 在定义类的时候,我们也可以加入一些泛型限制一些内容
class Animal<T> {name: Tconstructor(name: T){this.name = name}action<T>(say: T) {console.log(say)}
}
let cat = new Animal<string>('千锋大前端')
cat.action<string>('Hello,欢迎来到千锋大前端')

二、断言

  • 断言是一个非常有意思的小玩意,有的时候可以在我无助的时候给我带来一丝希望
  • 我一直觉得断言就是 “奥特曼”

image.png

  • 看一个例子
// 获取了一个页面上的 div 元素
const ele = document.querySelector('div')// 制作一个简单的功能函数,要求参数接受一个 DIV 元素
function util(ele: HTMLDivElement): void {}// 调用函数传入参数
util(ele)
  • 在正常不过的一段代码了,这个有啥的
  • 写完我们才发现

image.png

  • 为什么 ? 为什么 ?

image.png

  • 会不会是因为我定义 ele 变量的时候,没有限制类型呢

image.png

  • 这回下面好了,上面又出问题了
  • 解释一下吧
    • 其实是因为,我们获取元素这个操作,是有可能获取不到的
    • 当我们获取不到的时候就是 null
    • 就不是 HTMLDivElement 这个类型了
    • 所以在哪个地方限制好以后,都会出现问题的
  • 怎么办呢,这个时候,就可以使用断言了
  • 断言其实就是我主观给他强制定义一个类型,这样就不会出现问题了
const ele = document.querySelector('div') as HTMLDivElementfunction util(ele: HTMLDivElement): void {}util(ele)
  • 这里我就强制把 ele 元素断定为 HTMLDivElement 类型,那么就不会出现问题了
  • 其实在很多时候,我们不确定,或者拿不准的时候,我们都可以使用断言来解决问题
  • 先不让他报错,O(∩_∩)O~
  • 剩下的后面再说

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

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

相关文章

docker安装Debian:11 freeswitch1.10.5

文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步&#xff1a;安装freeswitch-mod和下载所需的依赖项3.2 设置密钥3.3 安装freeswitch所需的依赖项3.4 报错3.4.1 报错13.4.2 报错23.4.3 报错3 四、运行4.1 通话三十秒自动挂断 一…

Linux 第二十二章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

10种软件架构模式解析

1. 单体应用架构&#xff08;Monolithic Architecture&#xff09; &#x1f44c;单体应用架构是最基本的架构模式&#xff0c;它将整个应用作为一个单独的部署单元。所有功能和模块都集成在一个应用中&#xff0c;易于开发和部署&#xff0c;但随着应用的增长&#xff0c;可维…

java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher

软件开发过程中使用Java反射机制时遇到了下面的问题 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher.<init>(java…

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

【方法】如何创建RAR格式压缩文件?

为了方便存储或者传输文件&#xff0c;我们经常会把文件打包成不同格式的压缩包&#xff0c;那如果想创建的是RAR格式的压缩包&#xff0c;要如何做呢&#xff1f; RAR是WinRAR软件独有的压缩格式&#xff0c;所以我们可以通过WinRAR软件来创建RAR格式压缩包。下面分享两种创建…

视频素材哪个app好?8个视频素材库免费使用

视频内容已成为现代传播中不可或缺的一部分&#xff0c;具备卓越的视频素材对于提升任何媒体作品的质量和吸引力尤为关键。这里列举的一系列精挑细选的全球视频素材网站&#xff0c;旨在为您的商业广告、社交媒体更新或任何其他类型的视觉项目提供最佳支持。 1. 蛙学府&#x…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展&#xff0c;全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中&#xff0c;半导体作为信息产业的基础与核心&#xff0c;其重要性日益凸显&#xff0c;半导体的应用场景和市场需求将进一步扩大。 然而&#xff0c;在这一繁荣的背后&#x…

OceanBase学习1:分布式数据库与集中式数据库的差异

目录 1. 传统集中式数据库 2. 数据库中间件的分库分表 3. 分布式数据库的基本特点及对比分析 4. OceanBase和传统数据库的对比 5. 小结 1. 传统集中式数据库 优点 成熟稳定:经过近40年的发展&#xff0c;应用到各行各业&#xff0c;产品技术非常成熟稳定行业适配性强:适配…

微软开发新模型;YouTube 推出新AI功能;可折叠iPhone 或发布?

微软或开发新模型与 Google、OpenAI 竞争 The Information 报道&#xff0c;微软正在训练一种新的 AI 大模型「MAI-1」&#xff0c;规模上足以与 Google、Anthropic 乃至 OpenAI 的先进模型抗衡。 据报道&#xff0c;这个 MAI-1 模型由微软聘请的 Inflection 前 CEO Mustafa S…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

分布式任务调度工具 XXL-JOB

默认的账号密码是&#xff1a;admin/123456 一&#xff0c;部署docker容器 docker run \ -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.150.101:3306/xxl_job?Unicodetrue&characterEncodingUTF-8 \ --spring.datasource.usernameroot \ --spring.dataso…

百度副总裁秒批离职,00后的职场逆袭?

“员工闹分手提离职我秒批”&#xff0c;百度副总裁璩静的职场经历和思考在近期引发了大量讨论。 璩静在小红书分享了自己作为女性管理者&#xff0c;面对团队内部的感情问题&#xff0c;是如何处理的&#xff1a; “我第一时间就跟这个年轻的女孩子说&#xff0c;你走吧&…

Llama3-Tutorial之XTuner微调Llama3图片理解多模态

Llama3-Tutorial之XTuner微调Llama3图片理解多模态 基于 Llama3-8B-Instruct 和 XTuner 团队预训练好的 Image Projector 微调自己的多模态图文理解模型 LLaVA。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. 环境、模型、数据准备 1.1 配置环境 使用如…

【Delphi7】Access violation at address 0019F7C3. Write of address 0019F7C3.

这里写目录标题 问题基本情况问题描述1、启动Delphi 开发程序 时连续报如下错误2、打开“工程”菜单下的“选项”页面时时连续报如下错误 解决方案1、打开“高级系统设置”2、打开“性能选项”3、添加“数据执行保护”的程序4、选择“数据执行保护”的程序5、应用“数据执行保护…

从项目开始学习Vue——02(若依框架)

往期&#xff1a; 从项目开始学习Vue——01 目录标题 一、基础插件&#xff08;一&#xff09;路由Vue Router&#xff08;二&#xff09;导航守卫&#xff08;路由拦截器&#xff09;二、Vuex&#xff08;一&#xff09;什么是VuexVuex的部分介绍内容&#xff1a; &#xff08…

【数据分享】2022年中国1km分辨率的河网密度数据(免费获取)

水系数据是我们在各项研究中经常使用的数据&#xff01;之前我们分享过一份来源于Open Street Map的2024年全国水系数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享一份来源于Science Data Bank平台上的2022年中国1km分辨率的河网密度数据&am…

【正点原子Linux连载】 第四十章 Linux网络驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

java编程中,实现分页对象的类型转换

一、背景 当数据库分页查询返回的对象与接口要返回的对象类型不一致时&#xff0c;不可避免需要进行类型转换。 示例&#xff1a;数据库分页查询返回的对象是PageDTO&#xff0c;而接口返回的对象类型是PageVO。 PageDTO Data public class PageDTO<T> {/*** Current…