Typescript - function 函数(箭头函数 / 参数类型与返回类型 / 可选参数与默认参数 / 剩余参数 / 函数重载)通俗易懂详细示例教程

news/2024/12/2 21:41:14/

前言

在 Typescript 中,对 JavaScript 函数进行了 “升级”,继承了基本功能的同时又增加了一些新用法(使其更加严谨)。

用一个表格,可以大致描绘出异同点。

TypeScriptJavaScript
含有类型无类型
箭头函数箭头函数(ES2015)
函数类型无函数类型
必填和可选参数所有参数都是可选的
默认参数默认参数
剩余参数剩余参数
函数重载无函数重载

这些您暂时不必搞懂,后面会有详细示例。

箭头函数

这块他俩都一样,没有特别注意的地方。

TS 与 JS 示例用法如下,一样。

function fun() {setInterval(() => {console.log('箭头函数用法');}, 1000)
}

参数类型 / 返回类型

在 JavaScript 中,您无法指定函数的参数类型(传什么就是什么),更无法设置返回的类型。

先来看一下 JS 中,一个典型的例子。

function test(a, b) {return a + b;
}

再来看一下 TS,明确的参数类型与返回类型,语法很简单无需多言。

// 该函数的返回值将是一个string类型
function test(name: string, age: number): string {return name + age;
}// 正确示例
console.log(test('王佳斌', 55))// 错误示例(name不是字符串,age不是数值)
// Argument of type 'number' is not assignable to parameter of type 'string'.
console.log(test(55, '王佳斌'))

可选参数 / 默认参数

TS 支持您用简洁的语法,来表达可选参数及默认参数。

先来看一下 JS 中,一个典型的例子。

// 很简单,不传name的话就是"默认参数",反之亦然
function fun(name = '默认参数') {return name;
}

而 TS 中,则这样定义。

function fun(name: string = '默认参数') {return name;
}// 传参与不传参
console.log(fun('我是参数!'))//我是参数
console.log(fun())//默认参数

另外,在 TS 声明函数时,可以通过 ? 号来定义可选参数。

在实际使用时,需要注意的是可选参数要放在普通参数的后面,不然会导致编译错误。

// 其中,age和hok就是可选参数,你传递或不传递都行
function fun(name: string = '默认参数', age?: number, hok?: boolean) {return name + age + hok;
}// 要可选参数
console.log(fun('我是参数!', 15, true))//我是参数!15true
// 不要可选参数
console.log(fun('我是参数!'))//我是参数!undefinedundefined

当然,出现 undefined 是因为我在 return 时 “无脑” 拼接了它们,正常开发时肯定会做判断的。

剩余参数

简单来说,它指的是当你的函数需要同时操作多个参数,或者 并不知道会有多少参数传递进来时,就需要用了。

在 TS 中,使用三点运算符来接收,它是一个数组。

// 例如:实现一个累加的函数,把一些"未知个数"的数值累加,然后打印出来
// 除了必要参数name,剩余的参数统一传入
function fun(name: string, ...items: number []) {// 剩余参数(接收要累加的数值,是一个数组)console.log(items)// 最终结果let result = 0// 循环这些数值,进行累加for(let i = 1; i <= items.length; i++) {// console.log(i)result += i}// 计算结果console.log('结果', result)
}// 使用示例
fun('少传递一点,结果是:', 1, 2, 3)//6
fun('多传递一点,结果是:', 1, 2, 3, 4, 5, 6)//21

另外你也可以直接给函数一个剩余参数。

function fun(...items: number []) {// 传递过来的全部数值console.log(items)//[1, 2, 3]// 你的处理// ...
}

最后,在 JS 中同样也支持这么干,归功于 ES6 中引入了剩余参数。

函数重载

函数重载或方法重载,是使用相同名称和不同参数数量或类型创建多个方法的一种能力,也就是说通过为同一个函数提供多个函数类型定义来实现多种功能的目的。

用大白话说,就比如说吃饭是一个函数,但是西方人用叉子,东方人用筷子,细节有所不同,这种场景就比较适合用函数重载。

允许函数接收不同数量或类型的参数时,做出不同的处理。

function double(x: number | string): number | string {if (typeof x === 'number') {return x * 2;} else {return x + ', ' + x;}
}

本来这个函数,期望输入是 number,输出就是 number。或者输入是 string,输出就是 string。但是我们使用这种联合类型来书写的话,就会存在一个问题。

在这里插入图片描述

那如何解决这个问题呢?我们可以使用函数的重载。

function double(x: number): number; // 输入是 number 类型,输出也是 number 类型
function double(x: string): string; 
function double(x: number | string): number | string {if (typeof x === 'number') {return x * 2;} else {return x + ', ' + x;}
}let d = double(1);

在这里插入图片描述

需要注意的是,函数重载是从上往下匹配,如果有多个函数定义,有包含关系的话,需要把精确的,写在最前面。


http://www.ppmy.cn/news/40404.html

相关文章

java程序解析jts的geometry类型并入PG数据库

场景 GIS开发&#xff0c;会有需要将jts包中的geometry类型数据存入pg&#xff08;postgis扩展后&#xff09;数据库的需求。 工程是springboot&#xff0c;mybatis作为持久层框架。 解决方案 1. pg的geometry字段对应的类型为geometry类型&#xff0c;比如&#xff1a; 2.…

面向对象三大基本特征

面向对象三大基本特征封装继承多态封装 把客观事物封装成抽象的一个类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象来操作。 一个类就是一个封装的数据&#xff0c;以及操作这些数据的代码的逻辑实体。 在一个对象的内部&#xff0c;某些代码或者是某些数…

NTP8835(30W内置DSP双通道D类音频功放芯片)

数字功放是一种具有失真小、噪音低、动态范围大等特点的音频功率放大器&#xff1b;由工采网代理的韩国耐福旗下NTP系列专业功率放大器是ClassD功放的一个新里程碑。 NTP8835是一款高性能、高保真功率驱动集成全数字音频放大器&#xff0c;工作电压范围&#xff1a;7V&#xf…

linux上的无线网卡灯不亮

linux上的无线网卡灯不亮&#xff0c;查看了型号后&#xff0c;RTL8811CU 这个方法&#xff0c;可以说是一步到位 先克隆 git 仓库 git clone https://github.com/morrownr/8821cu-20210916.git cd 8821cu-20210916 直接运行安装脚本 ./install-driver.sh 安装完会问两个…

c语言获取天气信息示例(通过心知天气api获取)

关于curl/curl.h库的使用&#xff0c;参考下述内容&#xff1a; VS2010编译libcurl库并简单使用(c语言)_西晋的no1的博客-CSDN博客 1.先在心知天气注册&#xff0c;获取私钥&#xff1a; https://www.seniverse.com/dashboard 2.将私钥放入下述url中【私钥” 直接请求方式】 将…

Spark IPmapping方案

使用数据中的uid imei imsi mac androidid uuid 等标识字段&#xff0c;按优先级取一个标识&#xff0c;作为这条数据的用户唯一标识。有严重的漏洞。第一天登陆了&#xff0c;取uid&#xff0c;第二天没登录&#xff0c;取imei 是一个人吗。 在现实的日志数据中&#xff0c…

高性能网络SIG月度动态:virtio-net 支持动态中断调节,SMC v2 协议增加新扩展

高性能网络 SIG&#xff08;Special Interest Group&#xff09; &#xff1a;在云计算时代&#xff0c;软硬件高速发展&#xff0c;云原生、微服务等新的应用形态兴起&#xff0c;让更多的数据在进程之间流动&#xff0c;而网络则成为了这些数据流的载体&#xff0c;在整个云时…

Msray-Plus采集工具帮您快速获取数据,让您的市场营销更加精细

随着互联网的不断发展&#xff0c;数据已经成为企业竞争的重要资产之一。市场营销人员需要通过数据来了解客户需求、市场趋势和竞争对手情况&#xff0c;从而制定更加精细的市场营销策略。然而&#xff0c;采集数据并不是一件容易的事情&#xff0c;需要耗费大量的时间和精力。…