写篇文章让自己会写Ts——(4)Ts使用入中二门之函数与泛型

519 阅读3分钟

函数和泛型我认为是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
}

我们发现特点:

  1. 函数的声明结构中包含参数返回值的类型定义。
  2. 函数的类型写法都是箭头函数。
  3. 函数声明和函数类型中的参数名字只是用于区分,不需要等于谁谁。
  4. 结构容易混淆,注意分清类型代码功能代码

参数的类型与使用

我们发现我们声明函数结构体时是需要给有参函数的参数定义类型,而这里类似元组的特点。

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)

省去重复操作,总结得到下图:

image.png

可选参数类型会影响赋值成立和具体的函数传参

函数可选与默认特性

上面通过参数数量和可选我们得到了一些ts使用情况,这里进一步了解可选带来的影响。

参数可选的顺序不可以改变,只能最后:

//正确
(s: number, n: string, c?: boolean) 
//错误,报错如下图
(s: number, c?: boolean, n: string)

必选参数不能位于可选参数后

image.png

而默认参数并没有多少新内容和se6中规则基本一致,默认参数在这里等效于可选参数,只是多了一个赋值,在ts中使用特点可以参考可选参数。

所以:

image.png

额外参数

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')

image.png

image.png

我们使用泛型函数时在参数前写<参数类型>来确定当前函数的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(上海北京杭州多地)