函数是JavaScript应用程序的基础,它能帮助实现抽象层、模拟类、信息隐藏和模块。
在typescript里,虽然已经支持类、命名空间和模块,但是函数仍然是主要的定义行为的地方,typescript为JavaScript函数添加了额外的功能,让我们可以更容易的使用。
定义函数类型
在typescript中的函数并不需要刻意去定义,比如实现一个加法函数:
const add = (a:number,b:number) => a+b
实际上我们只定义了函数的两个参数类型,这时候整个函数虽然没有被显示定义,但是实际上typescript编译器是能感知到这个函数的类型的:
通过vs code的类型提示看到,typescript已经推断出了整个函数的类型,虽然我们并没有显式定义出来,这就是【类型推断】。
如何显式定义一个函数的类型呢?
括号里的(a:number,b:number)为参数类型,而通过 => 来连接参数与返回值,最后则是返回值的类型。
函数的参数详解
可选参数
一个函数的参数可能是不存在的,这就需要我们使用可选参数来定义。
我们只需要在参数后面加上?即代表参数可能不存在。
const add = (a:number,b?:number) => a + (b?b:0)
剩余参数
剩余参数与JavaScript中的语法类似,需要用 “ . . . “ 来表示剩余参数,而剩余参数rest则是一个由number组成的数组,在本函数中用reduct进行了累加求和。
const add = (a:number, ...rest:number[]) => rest.reduce(((a,b) => a + b),a)
重载
重载这个概念在很多传统编译语言中都存在。
function assigned(a:number,b?:number,c?:number,d?:any) {if(b===undefined && c === undefined && d=== undefined) {b = c = d= a} else(c === undefined && d === undefined) {c = ad = b}return {top: a,right: b,bottom: c,left: d}}
如果不知道具体实现,只是负责调用这个函数,只通过代码提示是搞不清楚需要传几个参数的,传不同的参数其返回值是不是一样的也不明白。
于团队而言,只能去看这个函数的实现,来决定要如何传参,若遇到复杂函数,增加了写作成本也造成了类型的不安全。
如上函数实际只能接受1,2,4个参数,如果传入3个是不会报错的,这就是类型不安全。
为了解决上述问题,因此函数重载出现了。
用同样的函数名声明参数分别为1,2,4情况下:
interface Direction {top: number,bottom?: number,left?: number,right?: number}function assigned(all: number): Directionfunction assigned(topAndBottom: number, leftAndRight: number): Directionfunction assigned(top: number, right: number, bottom: number, left: number): Directionfunction assigned (a: number, b?: number, c?: number, d?: number) {if (b === undefined && c === undefined && d === undefined) {b = c = d = a} else if (c === undefined && d === undefined) {c = ad = b}return {top: a,right: b,bottom: c,left: d}}assigned(1)assigned(1,2)assigned(1,2,3)assigned(1,2,3,4)
最后分别传入不同数量的参数,发现只有三个参数的情况下报错了。
函数重载在多人协作项目或者开源库中使用非常频繁,因为一个函数可能被大量的开发者调用,如果不使用函数重载,那么会造成额外的麻烦。interface Direction { top: number, bottom?: number, left?: number, right?: number } function assigned(all: number): Direction function assigned(topAndBottom: number, leftAndRight: number): Direction function assigned(top: number, right: number, bottom: number, left: number): Direction function assigned (a: number, b?: number, c?: number, d?: number) { if (b === undefined && c === undefined && d === undefined) { b = c = d = a } else if (c === undefined && d === undefined) { c = a d = b } return { top: a, right: b, bottom: c, left: d } }
