函数和泛型我认为是ts中难以理解和理清的知识,所以通过一篇文档对知识进行再总结和学习就十分有必要。
Ts函数
函数在前面文章中有简单出现和讲解过,但是实际上ts中函数的使用还有很多内容。
基本讲解
函数声明式结构和函数类型
function fun(str: number): number {
return str
}
let fun1: (s: number) => number = fun
也可以写成这种形式:
let funn: (s: number) => number = function (str: number): number {
return str
}
我们发现特点:
- 函数的声明结构中包含
参数
和返回值
的类型定义。 - 函数的类型写法都是箭头函数。
- 函数声明和函数类型中的
参数名字只是用于区分
,不需要等于谁谁。 - 结构容易混淆,注意分清
类型代码
和功能代码
。
参数的类型与使用
我们发现我们声明函数结构体时是需要给有参函数的参数定义类型,而这里类似元组的特点。
let funn: (s: number, n: string) => number = function (str: number, num: string): number {
return str
}
funn(12, '')
函数声明参数与函数类型参数
通过函数类型和函数声明不同参数数量对比发现:
let funn: (s: number, n: string, c: boolean) => number = function (str: number, num: string): number {
return str
}
funn(12, '', false)
省去重复操作,总结得到下图:
可选参数类型会影响
赋值成立
和具体的函数传参
。
函数可选与默认特性
上面通过参数数量和可选我们得到了一些ts使用情况,这里进一步了解可选带来的影响。
参数可选的顺序不可以改变,只能最后:
//正确
(s: number, n: string, c?: boolean)
//错误,报错如下图
(s: number, c?: boolean, n: string)
必选参数不能位于可选参数后
:
而默认参数并没有多少新内容和se6中规则基本一致,默认参数在这里等效于可选参数
,只是多了一个赋值,在ts中使用特点可以参考可选参数。
所以:
额外参数
js作为动态语言,函数的传参是不约束的,意味着可以传入任意数量和任意类型的参数。ts对此进行了规范,导致只能传入定义好的参数类型和数量以及顺序。但是我们还是想要处理定义之外的多余参数
,在js中使用通过内置对象arguments进行接收所有传入参数
,而ts中利用数组的解构来实现
。
//这里string[]限制了多余参数的类型。
(s: string, ...arr: string[])
通过这种方式我们在ts中来处理不可预测的传入函数的参数数量。
函数重载
暂无解读,可以查阅官方文档。
Ts泛型
通过Ts函数的学习,我很快发现泛型知识与函数密不可分。
基本讲解
泛型是一个后端常用知识概念,因为ts将js转变为静态语言,所以不可避免的出现拓展性的泛型功能。泛型顾名思义即任意类型,是用来处理不确定的类型的情况,比如一个函数要求输出他的输入。
function fun<T>(c: T): T {
return c
}
fun<string>('2')
我们使用泛型函数时在参数前写<参数类型>
来确定当前函数的T的类型,而且这里的T也只是一个代号、别称,可以写成任意标识符
。
function fun<S>(c: S): S {
return c
}
参数属性
你使用泛型的时候很容易就明白对于泛型带来的复用性好处,参数的不可控导致了其属性几乎不可用,比如length等等。
官方文档提出了结合数组的概念,用这种写法帮助我们使用数组的特性和属性:
function fun<T>(c: T[]): T[] {
console.log(c.length)
return c
}
字节电商前端持续招人,帮忙内推,简历请发1826235370@qq.com或微信15884204478(上海北京杭州多地)