【TypeScript】TS进阶-函数重载(七)

news2025/1/23 3:20:09

🐱个人主页:不叫猫先生
🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通、TypeScript从入门到实践
📝个人签名:不破不立
📢资料领取:前端进阶资料以及文中源码可以找我免费领取(文末有我wx)

在这里插入图片描述

目录

  • 函数默认参数/可选参数
  • 函数重载
    • 1、函数签名
    • 2、构造器重载
    • 3、联合类型函数重载
  • 拓展JS中函数重载
    • 1、利用arguments参数
    • 2、利用闭包和arguments

TypeScript从入门到实践专栏是博主在学习和工作过程中的总结,实用性非常强,欢迎订阅哦,学会TS不迷路。

TS系列标题
基础篇TS入门(一)
基础篇TS类型声明(二)
基础篇TS接口类型(三)
基础篇TS交叉类型&联合类型(四)
基础篇TS类型断言(五)
基础篇TS类型守卫(六)
进阶篇TS函数重载(七)
进阶篇TS泛型(八)
进阶篇TS装饰器(九)

函数默认参数/可选参数

对于同一个函数我们在不同场景下传参,参数有时候全部需要,有时候部分需要,定义多个同名函数就会报错,那么该怎么实现这个操作呢?我们可以为函数设置默认参数和可选参数。
给每个参数添加类型之后,可以不用给函数本身添加返回值类型,因为TS能根据返回语句自动推断出返回值类型

function start(name:string,age:number,phone?:number,sex?:string):string{
   if(phone&&sex){
        return `name:${name},age:${age},phone:${phone},sex:${sex}`
   }else{ 
        return `name:${name},age:${age}`
   }
}
start('zhangsan','14')//name:zhangsan,age:14
start('zhangsan','14',15678777777,'男')//name:zhangsan,age:14,phone:15678777777,sex:男

另外我们看它编译后的样子,其中返回值使用了concat来连接字符串,也让我们学习到模版字符串的实现原理。

function start(name, age, phone, sex) {
    if (phone && sex) {
        return "name:".concat(name, ",age:").concat(age, ",phone:").concat(phone, ",sex:").concat(sex);
    }
    else {
        return "name:".concat(name, ",age:").concat(age);
    }
}
start('zhangsan', 14); //name:zhangsan,age:14
start('zhangsan', 14, 15678777777, '男'); //name:zhangsan,age:14,phone:15678777777,sex:男

但是我们要是有很多场景,参数类型也都不一致,我们这样写很难维护,并且定义的规范很难适用于实际多个场景,那么我们可以使用函数重载来处理。

函数重载

什么事函数重载呢?当我们多次调用函数时传递不同参数数量或者类型,函数会做出不同处理。

1、函数签名

这里介绍个名次「函数签名」,顾名思义,函数签名主要定义了参数及参数类型,返回值及返回值类型。函数签名不同,函数会做出不同的处理,这是我对函数重载的理解。

2、构造器重载

举个例子,声明一个类Course,里面写一个start的方法,我们调用 start时传入不同参数类型已经参数个数,start方法会做出不同处理,那么怎么实现呢?具体如下:

type Combinable = number | string;
class Course {
   //定义重载签名
   begin(name: number, score: number): string;
   begin(name: string, score: string): string;
   begin(name: string, score: number): string;
   begin(name: number, score: string): string;
   //定义实现签名
   begin(name: Combinable, score: Combinable) {
       if (typeof name === 'string' || typeof score === 'string') {
           return 'student:' + name + ':' + score; 
       }
   }
}

const course = new Course();
course.begin(111, 5);//没有输出
course.begin('zhangsan', 5);//student:zhangsan:5
course.begin(5, 'zhangsan');//student:5:zhangsan

以上代码中定义了4个重载前面和1个实现签名。

3、联合类型函数重载

声明一个函数arithmetic,参数类型为联合类型,返回值也是联合类型,但是如下代码却报错了。

function arithmetic(x: number | string): number | string {
    if (typeof x === 'number') {
        return x;
    } else {
        return x+'是字符串';
    }
}
arithmetic(1).length;

在这里插入图片描述

原因是没有明确函数string类型没有toFixed属性`,那么怎么用函数重载解决这个报错问题呢?
我们可以可以根据传参的类型和函数返回值声明多个同名的函数,只是类型和返回值不同而已。

function arithmetic(x: number): number;
function arithmetic(x: string): string; 
function arithmetic(x: number | string): number | string {
    if (typeof x === 'number') {
        return x;
    } else {
        return x+'是字符串';
    }
}
arithmetic(1).toFixed(1);

这样就不会报错啦,因为已经识别到arithmetic(1)的返回值是number类型。

拓展JS中函数重载

JS中函数重载怎么实现呢?

1、利用arguments参数

var arr = [1,2,3,4,5];
//注意:这里不能写成箭头函数,否则this指向的是window对象
Array.prototype.search = function() {
   var len = arguments.length;
   switch(len){
   case 0:
	 return this;
   case 1:
	 return `${arguments[0]}`;
   case 2:
	 return `${arguments[0]},${arguments[1]}`;
  }
}
console.log(arr.search()) //[1,2,3,4,5]
console.log(arr.search(1)) //1
console.log(arr.search(1,2)) //1,2

2、利用闭包和arguments

 function addMethod (obj, name, fn) {
        var old = obj[name];
        obj[name] = function () {
            if (fn.length === arguments.length) {
                return fn.apply(this, arguments)
            } else if (typeof old === 'function') {
                return old.apply(this, arguments)
            }
        }
    }

    var person = {name: 'zhangsan'}
    addMethod(person, 'getName', function () {
        console.log(this.name + '---->' + 'getName1')
    })
    addMethod(person, 'getName', function (str) {
        console.log(this.name + '---->' + str)
    })
    addMethod(person, 'getName', function (a, b) {
        console.log(this.name + '---->' + (a + b))
    })
    person.getName()  
    person.getName('zhangsan')
    person.getName(10, 20)

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

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

相关文章

一文读懂电商数字员工究竟是什么?| RPA铺第1期

百度的曦灵,中核的核小智、万科集团数字员工“崔筱盼”都曾在2022年度爆火,数字员工一夜之间成为众多行业追捧的对象,那么,他/她们究竟代表着什么,对企业而言,是噱头大于收益,还是收益大于噱头呢…

简单的客户端服务器(多线程)基于json通信

这是一个客户端和服务器通信的小项目,小编自己手写了一个json工具,测试比jsoncpp,protobuf "效率更高"(浅拷贝),改写成深拷贝效率会急剧下降(小编能力有限,知识点&#xf…

技术分享 | Spring Boot 异常处理

说到异常处理,我们都知道使用 try-catch 可以捕捉异常,可以 throws 抛出异常。那么在 Spring Boot 中我们如何处理异常,如何更优雅的处理异常,如何全局处理异常。是本章讨论解决的问题。Java 异常类首先让我们简单了解或重新学习下…

Android开发-AS学习(一)

完整项目最精简流程&#xff1a;Android <-> 接口 <-> 数据库Android开发工具&#xff1a;Android Studio项目目录信息&#xff1a;一、控件1.1 TextView基础属性描述layout_width组件的宽度layout_height组件的高度id为TextView设置一个组件idtext设置显示的文本内…

Linux 学习笔记(借鉴黑马程序员Linux课程)

Linux视频课程 简介 Linux诞生于1991年&#xff0c;由林纳斯托瓦兹在21岁时完成。此后成为最为流行的服务器操作系统之一。 Linux内核和系统发行版 由Linux系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能&#xff0c;如&#xff1a;调度CPU、调度内存、调…

【笑小枫的按步照搬系列】Redis多系统安装(Windows、Linux、Ubuntu)

笑小枫&#x1f495; 欢迎来到笑小枫的世界&#xff0c;喜欢的朋友关注一下我呦&#xff0c;大伙的支持&#xff0c;就是我坚持写下去的动力。 微信公众号&#xff1a;笑小枫 笑小枫个人博客&#xff1a;https://www.xiaoxiaofeng.com Windows 下安装 方式一&#xff1a;https…

HCL(新华三模拟器)如何连接CRT及改界面颜色

我使用的HCL版本是2.1.1官网下载连接&#xff1a;https://www.h3c.com/cn/Service/Document_Software/Software_Download/Other_Product/H3C_Cloud_Lab/Catalog/HCL/&#xff0c;一键直达下载官网这个版本可以适配virtualbox的5.2.44的版本&#xff0c;同时支持华为的ensp模拟器…

Spring Security 表单配置(一)

Spring Security 表单配置&#xff08;一&#xff09;工具版本及环境参考资源配置详细说明工具版本及环境 工具&#xff1a; IDEA 2021.3 Maven 3.8.6 JDK 8 Spring Boot 2.7.7 Spring Securiity 5.7.6 参考资源 Spring Security官网: https://docs.spring.io/spring-security…

javaEE 初阶 — 常见的锁策略

文章目录1. 乐观锁 vs 悲观锁2. 互斥锁 vs 读写锁3. 重量级锁 vs 轻量级锁4. 自旋锁 vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. synchronized 是哪种锁8. 相关面试题1. 乐观锁 vs 悲观锁 乐观锁 指的是预测锁竞争不是很激烈&#xff0c;也就是指这里做的…

排列组合两个列表中的元素 product(a,b)

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】排列组合两个列表中的元素product(a,b)关于以下python代码表述错误的一项是?from itertools import producta [1,2,3]b [4,5,6]print("【显示】a",a)print("【显示】b",…

修改Keil开发环境背景(修改为黑色主题)

修改Keil开发背景&#xff08;修改为黑色主题&#xff09;引言步骤总结引言 我们平时在Keil uVision5下开发单片机/嵌入式程序的时候&#xff0c;如果始终用的是官方的主题背景&#xff0c;往往会因为背景太白了&#xff0c;而导致视疲劳。我们使用VSCode往往不会有这种困扰&a…

Python处理字符串 中文(汉字)编码示例

在实际开发中&#xff0c;发现打印Python打印经常出现乱码&#xff0c;大部分都是编码引起&#xff0c;这里只是简单说一下utf-8/ gbk/ unicode编码之间的相互转换问题&#xff1a; utf-8是Unix下的一种通用编码&#xff0c;gbk是win环境下的一种汉字编码&#xff0c;unicode是…

计算机组成原理_总线仲裁

计算机组成原理总目录总线仲裁 由于总线连接着多个设备&#xff0c;那么在同一时刻多个设备想要占用总线时&#xff0c;就会发生冲突问题 为了解决冲突问题&#xff0c;就需要规定好所有设备使用设备的优先权&#xff0c;仲裁也就是判断设备占用总线的优先权 例如设备A的任务比…

Docker--安装mysql8--方法/步骤

原文网址&#xff1a;Docker--安装mysql8--方法/步骤_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何使用docker安装mysql8。 查看mysql版本 https://hub.docker.com/_/mysql/tags 我选择8.0&#xff0c;点击右侧箭头处直接复制命令。 拉取镜像 拉取镜像的命令 docker pul…

RADIANT:一种全新的雷达图像关联网络用于3D目标检测

RADIANT&#xff1a;一种全新的雷达图像关联网络用于3D目标检测 论文地址&#xff1a;RADIANT: Radar-Image Association Network for 3D Object Detection 源码&#xff1a;https://github.com/longyunf/radiant 单位&#xff1a;密歇根大学、福特 动机 作为一种能够直接…

全景剖析阿里云容器网络数据链路(二):Terway EN

作者&#xff1a;余凯 本系列文章由余凯执笔创作&#xff0c;联合作者&#xff1a;阿里云容器服务 谢石 对本文亦有贡献 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的 IaaS 化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观…

使用小度音箱+Blinker控制ESP01S Relay继电器模块

一. 使用ESP01S模块&#xff0c;PIN脚定义如下&#xff1a; 管脚功能如下&#xff1a; ESP01S模块原理图&#xff1a; ESP01S模块比ESP01模块做了以下优化&#xff1a; LED灯的管脚发生变化&#xff0c;由ESP01的TXD0变成ESP01s的GPIO2引脚&#xff1b;ESP01s模块的IO0、RST、…

Java开发 - Spring MVC框架初体验

前言 上一篇Spring框架感觉写的偏向于理论知识&#xff0c;所以从这篇开始&#xff0c;转变此系列的写作思维&#xff0c;更多的将从实操的角度来讲解Spring MVC框架的使用和相关知识点&#xff0c;会尽量详细&#xff0c;但这一系列课程针对的还是有Java基础的小伙伴&#xf…

树莓派上如何安装anaconda/miniconda环境配置

目录1. 前言2. miniconda下载3. miniconda 安装4. 添加 .bashrc 配置5. Conda 更换源&#xff0c;软件更新6. 部分问题及解决方案报错一&#xff1a;报错二&#xff1a;报错三&#xff1a;7. 卸载miniconda8. 版本问题/注意事项1. 前言 在装完树莓派之后&#xff0c;当你想要使…

()智能指针一) shared_ptr

智能指针(一) 文章目录智能指针(一)shared_ptr1初始化方式make_ptr<>() 和 shared_ptr<>() 的区别shared_ptr维护引用计数需要的信息使用原始的new函数创建shared_ptr使用make_shared创建shared_ptrmake_shared实现异常安全使用make_shared的缺点make_shared 源码解…