TS 泛型你还不会?来!我教你

news2025/1/18 17:17:09

前言:最近遇到了一些写作上的烦恼,自己好像陷入了程序员的通病想法,“这个知识点这么简单,大家应该都会吧,我说出来是不是显得我很笨。”

思考了近一个月,又翻了翻自己最开始写作的文章,文笔虽显稚嫩,但初心是真真正正想和大家分享某一个知识点。那时候的写作不为求阅读量,不为凸显自己的水平,只求能把语言尽可能用大白话表达出来,帮助同样是初学者的某位读者。

而现在怎么随着工作时间的增长,反而越来越违背自己写作的初心了呢?于是就诞生了这篇文章的写作契机。

注意:本文面向 TS 泛型初学者,遂只会用通俗的口语来表达。不会引经据典插入官网文档,我要做的就是让你初步理解它解决了什么事情。

一. 场景再现

  1. 我们先不要去想泛型这两个字是什么意思,我们先思考下面这个场景。

  2. 有这样一个需求,这个函数可以传递一个字符串,并且把参数原封不动返回。你心想,太简单了,一秒钟实现,ok 工资到手。
    image.png

  3. 产品经理这时候又跑来加了个需求,要求也能输入数字类型,ok,没问题,简单的。
    image.png

  4. 没一会,产品经理又说:不行不行,布尔值也得加上。你虽然抱怨了几句,但还是很快的修改完成了修改。
    image.png

  5. “emm,那个韩同学呀。我想了一下,还得加上 undefined ,和 null ”这样才完整,看着产品小姐姐满脸笑容的样子,你也生气不起来,于是又加上了两行代码。
    image.png

  6. 现在功能倒是实现了,但是你看着这个函数陷入了沉思,倒不是因为产品经理的需求让你烦恼,而是有一丢丢代码洁癖的你开始思考有没有什么方法让这么一大串的东西简单点呢?🤔

二. 理清线索

  1. 我们将刚刚的上面这段代码搬到下面来。

    function say(txt: string | number | boolean | undefined | null) {
      return txt;
    }
    
  2. 先别着急,我们捋一下目前我们已掌握的线索🤔:(1)这个函数会接受一个参数。(2)这个函数有一个返回值。(3)这个函数的返回值的类型参数的类型是相对应的。

  3. 你突然灵光一闪,我怎么给忘了一个神器了呢?any 救我,好家伙,那你和直接写 js 有什么区别呢?
    image.png

  4. 那到底有没有什么更加简单的方法就能达成我们最初的需求呢?你别说,还真有,加下来引入今天的主角泛型

三. 泛型的用途

  1. 不要被这个名字给吓唬到了,刚开始我不敢去理解这个知识点,有百分之90的原因就是因为泛型这个名字就给人一种很高冷的感觉,但其实理解起来十分简单,只不过它的写法有些特殊,仅此而已。接下来我不会提及“泛型”二字,只让你理解它是干什么的。

  2. 这是我们上面的代码,TS 老给我划红线提示我没传参数,我也很急啊,因为我真的不知道该写什么类型,我现在也没确定。
    image.png

  3. 这咋办,于是你在想,我能不能先随便写个东西占着地方,等我真正用的时候再告诉你我需要什么类型。

  4. 于是你随手写了一堆符号,先占住位置,但是你并没有声明这个 XXXXX 的类型啊,TS 不知道啊,那我肯定不给你通过的。
    image.png

  5. 这咋整,这不让,那不让,那我还写不写代码了?别急嘛,人家 TS 也不是那么无情,慷慨的甩给你两个尖括号<>,也就是键盘上的大于号&小于号。你和 TS 各退一步,TS 允许你在图书馆占座,但是你得告诉它占座的人是谁,占座的那个人你得用<>包起来。

  6. 在哪占座?TS 环顾四周,指着这个位置,“那你就在这坐吧。”

    image.png

  7. 怎么占座?人家不告诉你了嘛?用<>包起来。
    image.png

  8. 此时我们再看 TS 的类型提示,返回值参数类型都变为了占座的这个人。
    image.png

  9. 当我们实际调用的时候,让占座的人走开,把已知的参数放进去即可。
    image.png
    此时我们再观察函数提示,就会发现 TS 自动帮我们替换掉了 XXXXX 占位符。
    image.png

  10. 到这里你其实会发现,我并没有用常规的大写 T 来这里占位,而是用来一个很不规则的 xxxxx 来占位,其实就是想告诉大家,官方文档用 T ,并不代表它只能用 T不要把自己局限在“别人这样写,我就只能这样写。” 否则当别人问及你的时候,你只能回答:“我也不知道,我看别人都这样写,所以我才这样写。” 这样其实很不好。
    image.png
    tips:官方这里用 T 其实是取字母 type 的首字母来表达类型占位的概念,写 T 更多的是代码规范而不是定死的结论。

四. 你其实正在使用泛型

  1. vue3 的小伙伴其实对这种写法已经熟悉的不能再熟悉了。
    image.png

  2. 你也早已习惯 vue 的类型提示,因为我 namestring 类型,所以自然而然有下面这些提示。
    image.png

  3. 但不要忘了,vue 只是包装了 js,它本身并不提供类型提示,这时你可能开始好奇了,这是怎么回事?🤔

  4. 不要忘了这个 ref 其实是一个函数!!!
    image.png

  5. 你上面的写法其实等价于下面的写法。
    image.png

  6. 眼熟吗?这不就是我们刚刚提到的占位吗?
    image.pngvue 其实不就是这样定义 ref 函数的吗?
    image.png

  7. computed 也是同样的道理。
    image.png

  8. 只不过我们开发时省略了占位类型,因为 TS 会通过函数的返回值类型帮你做这一步。

五. 补充

  1. 泛型其实和函数的形参的概念很类似,你可以对比这两个概念的实际用法。

  2. 泛型不止可以传递一个,可以传递多个。
    image.png

  3. 泛型可以有自己的默认类型,写法如下。
    image.png

  4. 泛型还有更加灵活的用法,比如约束类型中的某个类型。
    image.png

  5. 泛型还有更多灵活的组合方法,需要读者遇到具体的场景时,通过这些前置知识组合出自己的泛型约束,届时会体会的更加深刻,本文不做过多探讨。

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

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

相关文章

python二次开发Solidworks:方程式驱动曲线

如果按照维度去划分&#xff0c;SOLIDWORKS中曲线可以划分为平面曲线和空间曲线&#xff0c;并且在二维草图还是3D草图中都提供了“方程式驱动曲线”。但是从使用方法来讲&#xff0c;方程式驱动的曲线分为两种定义方式:“显性”和“参数式”。“显式方程”在定义了起点和终点处…

核酸管外观缺陷检测(一)

1.1 应用示例思路 (1) 对核酸管图像进行灰度化、阈值分割和连通域分析&#xff1b; (2) 筛选出待检测的区域&#xff0c;并对该区域进行变换校正&#xff1b; (3) 进一步获取待检测的ROI区域&#xff0c;并根据几何特征和阈值条件&#xff0c;来对核酸管外观进行检测&#x…

openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成

文章目录 openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成103.1 操作场景103.2 前提条件103.3 自认证证书生成过程 openGauss学习笔记-103 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书生成 openGauss默认…

【密评】商用密码应用安全性评估从业人员考核题库(十)

商用密码应用安全性评估从业人员考核题库&#xff08;十&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 2251 单项选择题 根据 GM/T 0030《服务器密码机技术规范》&#xff0…

系统架构师备考倒计时17天(每日知识点)

一、数据库设计阶段以及相应的产物 需求分析阶段&#xff1a;数据流图、数据字典、需求说明书&#xff1b;概念结构设计阶段&#xff1a;ER模型&#xff1b;逻辑结构设计阶段&#xff1a;关系模式&#xff1b;物理设计阶段&#xff1a;包括存储结构和存取方法的物理结构。 &…

35岁左右的项目经理,这5种能力一定要有​

大家好&#xff0c;我是老原。 经常有项目经理和我吐槽&#xff0c;现在不管是做项目&#xff0c;还是做管理&#xff0c;都太难了。 上有甲方和和老板给压力&#xff0c;下有团队成员叫苦连天&#xff0c;最后里外不是人。 刚毕业20多岁的时候还好&#xff0c;随着年龄的增…

(矩阵) 289. 生命游戏 ——【Leetcode每日一题】

❓ 289. 生命游戏 难度&#xff1a;中等 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一…

【算法设计与分析qwl】伪码——顺序检索,插入排序

伪代码&#xff1a; 例子&#xff1a; 改进的顺序检索 Search(L,x)输入&#xff1a;数组L[1...n]&#xff0c;元素从小到大排序&#xff0c;数x输出&#xff1a;若x在L中&#xff0c;输出x位置下标 j ,否则输出0 j <- 1 while j<n and x>L[j] do j <- j1 if x<…

2022年全网最全最细最流行的自动化测试工具有哪些?

一&#xff1a;前言 随着测试工程师技能和工资待遇的提升&#xff0c;甚至有一部分的开发人员开始转入测试岗位&#xff0c;跨入自动化领域的测试攻城狮越来越多。在自动化测试领域&#xff0c;自动化工具肯定占据了核心的位置。 本文总结了常用的测试自动化工具和框架&#x…

QT_day2

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

rust学习——函数返回值

概念 Rust 中的函数定义以 fn 开始&#xff0c;后跟着函数名和一对圆括号。大括号告诉编译器函数体在哪里开始和结束。 特殊的地方——函数返回值 错误的写法 正解1 去掉分号 fn main() {let x plus_one(5);println!("The value of x is: {}", x); }fn plus_…

c++_learning-进阶部分

文章目录 类&#xff1a;抽象类&#xff1a;类、类作用域&#xff1a;类成员访问权限&#xff1a;使用细节&#xff1a;成员函数的修饰符const、mutable&#xff1a;const在类中的使用&#xff1a;mutable&#xff1a; this&#xff1a;返回自身对象的引用构造函数&#xff08;…

思科 Packet Tracer实验(一)

思科 Packet Tracer实验&#xff08;一&#xff09; ​ Cisco Packet Tracer 是由Cisco公司发布的一个辅助学习工具&#xff0c;为学习思科网络课程的初学者去设计、配置、排除网络故障提供了网络模拟环境。用户可以在软件的图形用户界面上直接使用拖曳方法建立网络拓扑&#…

金山终端安全系统V9.0 SQL注入漏洞复现

0x01 产品简介 金山终端安全系统是一款为企业提供终端防护的安全产品&#xff0c;针对恶意软件、病毒和外部攻击提供防范措施&#xff0c;帮助维护企业数据和网络。 0x02 漏洞概述 金山终端安全系统V9.0 /inter/update_software_info_v2.php页面存在sql注入漏洞&#xff0c;该…

李彦宏:我们即将进入一个AI原生的时代|百度世界2023

“大模型带来的智能涌现&#xff0c;这是我们开发AI原生应用的基础。” 10月17日&#xff0c;李彦宏在百度世界2023上表示。当天&#xff0c;李彦宏以《手把手教你做AI原生应用》为主题发表演讲&#xff0c;发布文心大模型4.0版本&#xff0c;并带来新搜索、新地图等十余款AI原…

时间序列预测 Graph-WaveNet:Graph WaveNet for Deep Spatial-Temporal Graph Modeling

Graph-WaveNet Graph WaveNet for Deep Spatial-Temporal Graph Modeling1.概述2.提出问题 & 解决策略 & 模型结构3.实验结果 ** Graph WaveNet for Deep Spatial-Temporal Graph Modeling ** 1.概述 时空图建模是分析系统中各组成部分的空间关系和时间趋势的一项重…

从裸机启动开始运行一个C++程序(十)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;九&#xff09; 从裸机启动开始运行一个C程序&#xff08;八&#xff09; 从裸机启动开始运行一个C程序&#xff08;七&#xff09; 从裸机启动开始运行一个C程序&#xff08;六&#xff09; 从裸机启动开始运…

算法基础学习|二分

二分 模板 整数二分模板 bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用&#xff08;即寻找左边界使用&#xff09;&#xff1a; int bsearch_1(int l, int r) {while (l < r){int mid l r >> 1;if (…

最新AI创作系统ChatGPT源码+搭建部署教程+支持GPT4.0+支持ai绘画(Midjourney)/支持Prompt

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

Cocos Creator3.8 项目实战(十)使用 protobuf详细教程

在 Cocos Creator 中使用 protobuf.js 库可以方便地进行协议的序列化和反序列化。 下面是使用 protobuf.js 的详细说明&#xff1a; 一、protobuf环境安装 1、安装 npm protobuf环境安装安装需要使用 npm 命令进行&#xff0c;因此首先需要安装 npm 。 如果你还没安装 npm …