引言
- 函数也需要添加类型
- 给函数本身添加类型
- 函数的参数添加类型
- 给函数的返回值添加类型
函数声明方式
- 函数表达式 const fn = function()
- 函数关键字来声明类型
函数表达式来声明类型
- 如果在函数里面标识,返回值需要用=>来标识
- 这里一般我们不需要给函数本身添加类型,因为函数表达式可以自动推导
那什么时候我们需要给函数本身添加类型呢?
- 当我们把表达式抽离出去的时候,我们需要给函数本身添加类型
- 这样写就是兼容性,表示我要看这个fn是否满足sum类型
注意:以上两个写法,一个是定义函数,一个是把函数赋给一个变量
函数关键字来声明类型
- 函数关键字声明是不能给函数本身添加类型的,只有函数表达式可以
- 只需要考虑函数的参数和返回值
- 函数的参数依旧支持js的特性,比如默认值、剩余运算符,有一个js没有但ts有的,就是可选参数,可选参数就是可传可不传
- 这个b如果你传值了,这个b的类型就是string,如果你不传这个b,那么这个b就是string或者undefined
如果我们想在函数里使用this
- 这种写肯定是不行的,因为我defaultFn1参数this的类型写死了,那么我们应该给this什么类型呢?
- 我们可以使用typeof来提取obj的类型,在ts中类型一般都有变量提升的能力,所以我们可以写在下面,提取出的类型就是{name:"string"}
通过函数关键字声明注意
- this类型要进行声明
- 我们不再使用arguments,如果要使用,一般也就是取length
- 可以通过可选操作符来设置属性是否必须传递
ts给我们设计了一个函数的重载
- 参数不同,对应的逻辑就不同
- ts的函数重载指代的就是类型,和代码没有关系
我们先看一个函数写法
- 这种写法其实是有问题的,因为我们假如说传number,按照这个函数的逻辑返回的是一个number[],但实际上我们调用这个函数传number,得到的是string[] | number[],因为这个函数的返回值类型就是string[] | number[],返回值类型是不确定的,其实是不合理的,因为我们期望传string返回string[],传number返回number[],所以我们需要进一步限制
所以我们可以这样做
注意
假如说我们只写了function toArray(val:number):number,没写function toArray(val:string):string,那么我们调用toArray传字符串就是错误的,因为这样写它不认,我们可以把上面的toArray看做是这个函数的进一步限制,写了上面的函数之后,最下面的其实就失效了。那可能有人就问了,那我最下面的toArray的类型不写行不行,答案是不行的,你必须要写类型,并且你写的类型必须大于上面toArray里的类型,比如你把最下面的toArray里的类型都写成any,也是可以的。
总结
一个函数,拥有不同的使用功能,我们就考虑函数的重载