TS 函数重载你还不会?来!我教你

news2024/9/22 21:28:25

前言: 今天在项目中遇到了后端接口参数类型接口返回值需要修改的场景,由于这个函数在很多页面都用到了,就导致改完相关 api 函数的时候 TS 疯狂报错,所有的参数和返回值都需要跟着改,一时间头疼。正当我手足无措的时候,突然想到之前看 vue 源码的时候看到 函数重载 的使用,于是我第一次在项目中使用了函数重载,完美解决了我的问题。


一. 场景再现

  1. 我们先不要想函数重载是什么意思,我们从具体场景一步一步去了解这个名词的含义,你会理解的更深刻。

  2. 假设现在后端有一个接口,可以通过一个 ID 来获取用户信息。那么前端对应的 api 可能就有这样一个函数,

    image.png

  3. 现在还有一个接口,就是通过很多个 ID 来获取很多个用户的信息。那么这个函数就可能被设计成这样子。

    image.png

  4. 等等,先别着急喷。别说是你,我自己看着都感觉这种方式很蠢,为什么不把它设计成一个函数呢?哎,对哈,那我们就动手改造一下这两个函数。
    image.png

  5. 既然参数类型不同,那么后端对应的返回值类型肯定也是不一样滴,我们还需要设定一下返回值类型。我们随手定一个一个 interface 来表示这个后端接口返回给我们的数据类型。

    image.png

    所以现在我们的函数就变成了下面这个样子。
    image.png

  6. 这时候就需要前端手动去判断传递的参数到底是单个字符串还是一个字符串数组。
    image.png

  7. 乍一看感觉还挺好,但是你会发现当你在调用这个函数的时候,TS 的类型提示好像不是那么对劲。什么意思呢?我们直接调用这个函数看一下类型提升现在是什么样子的。
    image.png
    你可能会说,你骗谁呢?这类型提示不是好好的吗?别着急,容我们再声明一个变量准备接收这个函数的返回值。

  8. 现在我在一个组件内部很明确的知道我要发送一个 ID数组 去获取很多用户的数据。那么我可以很清楚的定义我们的变量就是 DataType[] 的类型。
    image.png
    这里需要特别提醒:虽然现在我只发生了一个用户的数据,但是后端根据我的参数类型是一个数组,仍会返回一个数组类型的用户数据给我,即使那个数组只有一条用户数据。)

  9. 那么我们就可以很自然的写出下面的代码。
    image.png
    随之你就会发现 TS 飘红了,你函数的返回值类型和变量定义时候规定的类型不符合。
    image.png

  10. 错误原因很简单,就是我们人类的直觉。我们很聪明的认为,我给你传递的如果是一个字符串,那么你这个函数就应该很听话的给我返回 个用户信息就完事了。我给你这个函数如果传递的是一个字符串数组,那么我就是我想获取多个用户的信息,你就应该给我返回一个信息数组。但是很抱歉 TS 没有这么智能,它确实不知道你到底是想一个一个字符串 返回==>一个数据,还是 一个字符串 返回==> 多个数据
    image.png
    是的,TS 目前只知道你的参数只有两个类型,你的返回值只有两个类型,但是它不知道你的参数对应的你想返回哪个类型。

二. 解决飘红的方法

  1. 那么我们如何解决目前 TS 飘红的问题呢?
    image.png

  2. 第一种方法也是最简单的方法,直接使用 TS 类型断言 as 关键词,明确的告诉 TS 你这个函数的返回值是什么。
    image.png
    as 的作用你可以类比于 CSS 中的 important ,我非常确定这个变量的类型是什么,不需要 TS 帮我做类型推导。

  3. 这也是我最开始使用的方法,也是我最经常使用的方法。你可能也看出来了,这样的话我就需要在每一个使用这个函数的地方都 as 一下,非常非常笨也不优雅。

  4. 那有没有什么方法让 TS 变聪明一点,让它帮我自动分辨我各个参数对应什么返回值呢?你别说,还真有,引出我们的主角----函数重载

三. 什么是函数重载(overload)

  1. 在引出函数重载之前我们需要了解一个前提知识,在 JS 里同一个函数是可以被声明多次的,结果是会优先采用最后一次的函数体。什么意思呢?如下图,这是一个 .js 文件,JS 不仅不会报错,并且还可以正常执行。
    image.png

  2. 然而在 TS 里这种方式是会引发类型报错的。虽然 TS 只是会提醒类型错误,不影响这个文件的最终运行。但是明眼人都可以看出哪种开发模式更加适合团队合作。很明显 TS 更加符合我们的直觉,不允许变量在同一作用域下多次赋值。
    image.png

  3. 所以 JS 是没有重载签名这个概念的,这是 TS 所给你带来的优势。关于函数重载更加深刻的实现原理,由于使用的不多我暂时无法给你深入讲解原理,在这里我仅谈一谈目前我个人理解,可能有些大白话,但是应该可以帮你先浅浅的了解这个名词。

函数重载的概念主要由两部分组成。1.重载签名 2.实现签名

四. 重载签名

  1. 我们先说重载签名,我们知道函数基本上是由四部分组成:一个函数名,一个函数参数,一个函数体,一个返回值。
    image.png

  2. TS 可以帮你分别约束 参数类型返回值类型,也就是下面这两个。
    image.png

  3. 重载签名的意思就是只需要你提供一个函数的参数类型返回值类型,不需要你提供函数体。什么意思呢?这里我们还拿刚刚获取用户信息 getData 举例子。
    image.png

  4. 我们就可以声明一个同名函数。getData 按照上面刚刚讲到的,我们只约束它的参数类型返回值类型。我们发现,TS 竟然没有报错。
    image.png

  5. 按照同样的思路,我们再声明一个通过 ID数组 获取多个用户信息的函数。
    image.png

  6. 如果你留心的话,到现在我们其实已经实现了函数重载。你会发现我们现在已经不需要 as 去告诉 TS 类型了,它已经帮我们完成了推导。
    image.png

  7. 我们换一下参数类型,我们把参数类型换成一个字符串看看是什么结果。你会发现,TS 非常聪明的推断出,你想要的结果是一个用户的数据,并不是多个用户的数据,所以提示你参数错误。
    image.png

  8. 我们改一下 userData 的类型来确认一下我们的猜想是否正确。
    image.png
    TS 没有报错,果然是我们所想的那样。

五. 实现签名

  1. 聪明的你可能已经猜到了,实现前面其实就是一个带有函数体的同名函数。并且这个函数的参数类型要完全包含函数签名所有类型
    image.png

  2. 什么意思呢?我们删除了 string数组 的参数类型。你会发现第二个函数签名飘红报错了。
    image.png
    错误信息如下:
    image.png

  3. 实现签名的返回值同理,不再过多赘述。

  4. 最重要的一点来了,你需要在实现签名内非常明确的判断出不同类型的参数所对应的返回值。才能让 TS 去实现精确的类型推导。
    image.png

  5. 至此你已经完成了标题的功能---- 函数重载

六. 额外知识

  1. 函数重载可以有多个重载签名,但是只允许有一个实现签名。说白了就是一个函数名只能有一个函数体。
    image.png

  2. 函数重载不仅仅只能约束参数类型,还能根据参数的数量去返回不同的类型的返回值。(arguments:别忘了函数内还有我这个对象。T.T)

  3. Class 类也可以实现 constructor 的重载。

  4. 也许你早就遇到过 TS 给你抛出的这个错误,但是你之前可能不知道是什么引起的。心里默念(overload+1)到底是什么鬼啊!
    image.png

结语

TS 真是越用越香!!!🎁

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

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

相关文章

为什么选择pnpm

npm V3版本之前 问题1 会将模块对应的依赖装到当前模块下,那么如果有嵌套的话,依赖树就会比较深.这中长路径会导致在windows下是找不到的.有一句玩笑话是宇宙最深的不是黑洞而是nodemodules. 问题2 相同的包如果被不同的包依赖就会下载多个副本,造成磁盘空间的浪费 npm V…

知不知道什么叫米筐量化?怎么来的?

现在量化市场范围越来越大,各种量化系统也是普遍性的了,不过米匡量化这个开发系统通常是由交易接口的专业开发团队开发的的结果,那么米匡量化的终端又是是怎么开发成功的呢?首先,我们可以从api接口的调用来了解&#x…

高通开发系列 - 总目录

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录序言序言 大家好,欢迎进入《高通开发系列》专栏,小编有10余年嵌入式开发经验,…

77页智慧城市顶层设计方案

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容:篇幅有限,无法完全展…

天猫商城自动化python脚本(仅供初学者学习使用)

作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)

行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测) 目录 行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测) 1. 前言 2. 人体检测数据集说明 3. 基于YOLOv5的人体检测模型训练 4.人体检测模型…

开源工具系列4:Nuclei

前言 Nuclei 用于基于模板跨目标发送请求,从而实现零误报并提供对大量主机的快速扫描。Nuclei 提供对各种协议的扫描,包括 TCP、DNS、HTTP、SSL、File、Whois、Websocket、Headless 等。凭借强大而灵活的模板,Nuclei 可用于对各种安全检查进…

ArcGIS中ArcMap创建渔网Create Fishnet:生成指定大小的格网矢量文件

本文介绍在ArcMap软件中,通过“Create Fishnet”工具创建渔网,从而获得指定大小的矢量格网数据的方法。 首先,我们在创建渔网前,需要指定渔网覆盖的范围。这里我们就以四川省为例,在这一范围内创建渔网;其中…

2.13作业【设备树解析,按自己理解】

设备树定义 设备树(device tree是描述硬件信息的一种树形结构,设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存…

[Datawhale][CS224W]图神经网络(一)

目录一、导读1.1 当前图神经网络的难点1.2 图神经网络应用场景及对应的相关模型:1.3 图神经网络的应用方向及应用场景二、图机器学习、图神经网络编程工具参考文献一、导读 ​ 传统深度学习技术,如循环神经网络和卷积神经网络已经在图像等欧式数据和信号…

RoI Transformer论文翻译详解

Learning RoI Transformer for Oriented Object Detection in Aerial Images 0.摘要 航空图像中的目标检测是计算机视觉中一个活跃而又具有挑战性的任务,因为它具有鸟瞰视角、高度复杂的背景和变化的物体外观。特别是在航空图像中检测密集的目标时,基于…

01-RTOS

对于裸机而言,对于RTOS而言即:对于裸机,打游戏意味着不能回消息 回消息意味着不能打游戏对于RTOS 打游戏和裸机的切换只需要一个时间片节拍 1ms 从宏观来看 就是同时进行的两件事(但要在这两件事情的优先级一样的情况下&#xff0…

HTML面试题

HTML面试题部分知识点梳理 1.如何理解HTML语义化 让页面的内容结构化,便于对浏览器、引擎解析,易于阅读,便于维护理解,利于SEO。 2.H5的新特性 video/audio视频/音频canvas 绘画geolocation 定位 用于定位用户的位置WebSocket…

浅谈业务中台前端设计

做前端中台业务一年多的时间,有一些心得体会,和大家分享分享。 中台是什么中台业务的价值是什么做了哪些前端中台业务如何设计前端中台业务未来展望 中台是什么 百度百科的解释比较言简意赅:“中台,互联网术语,一般…

[数据库]表的约束

●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…

【MySQL】MySQL 中 WITH 子句详解:从基础到实战示例

文章目录一、什么是 WITH 子句1. 定义2.用途二、WITH 子句的语法和用法1.语法2.使用示例3.优点三、总结"梦想不会碎,只有被放弃了才会破灭。" "Dreams wont break, only abandoned will shatter."一、什么是 WITH 子句 1. 定义 WITH 子句是 M…

LeetCode——1234. 替换子串得到平衡字符串

一、题目 有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换一个子串」的方式&a…

Kubeadm搭建K8S

目录 一、部署步骤 1、实验环境 2、环境准备 3、所有节点安装Docker 4、 所有节点配置K8S源 5、所有节点安装kubeadm,kubelet和kubectl 6、部署 kubernetes Master 节点 7、token制作 8、k8s-node节点加入master节点 9、 master节点安装部署pod网络插件&a…

ChatGPT被玩疯,问“如果美国倒了,世界会怎样?”回答太吓人了

“ChatGPT”大火不见消停…… 最近这些天,想必大家的社交平台都刷爆了“ChatGPT”这个词吧? 作为OpenAI 的语言模型工具,它可以生成文本、回答问题、对话、摘要、翻译等。 特点是语言表达流畅,思维敏捷,可以回答复杂…

golang语言本身设计点总结

本文参考 1.golang的内存管理分配 golang的内存分配仿造Google公司的内存分配方法TCmalloc算法;她会把将内存请求分为两类,大对象请求和小对象请求,大对象为>32K的对象。 在了解golang的内存分配之前要知道什么事虚拟内存,虚拟内存是把磁盘作为全局…