简介
Function 类型
TypeScript 提供 Function 类型表示函数,任何函数都属于这个类型
箭头函数
可选参数
参数默认值
TypeScript 函数的参数默认值写法,与 JavaScript 一致
参数解构
rest 参数
readonly 只读参数
如果函数内部不能修改某个参数,可以在函数定义时,在参数类型前面加上readonly关键字,表示这是只读参数
void 类型
需要特别注意的是:如果变量、对象方法、函数参数是一个返回值为 void 类型的函数,那么并不代表不能赋值为有返回值的函数。恰恰相反,该变量、对象方法和函数参数可以接受返回任意值的函数,这时并不会报错
这样设计是有现实意义的。举例来说,数组方法 Array.prototype.forEach(fn) 的参数 fn 是一个函数,而且这个函数应该没有返回值,即返回值类型是void。但是,实际应用中,很多时候传入的函数是有返回值,但是它的返回值不重要,或者不产生作用
上面示例中,push() 有返回值,表示新插入的元素在数组里面的位置。但是,对于 forEach() 方法来说,这个返回值是没有作用的,根本用不到,所以 TypeScript 不会报错。如果后面使用了这个函数的返回值,就违反了约定,则会报错
注意:这种情况仅限于变量、对象方法和函数参数,函数字面量如果声明了返回值是 void 类型,还是不能有返回值
除了函数,其他变量声明为 void 类型没有多大意义,因为这时只能赋值为 undefined 或者 null(假定没有打开 strictNullChecks)
局部类型|高阶函数
函数重载
有些函数可以接受不同类型或不同个数的参数,并且根据参数的不同,会有不同的函数行为。这种根据参数类型不同,执行不同逻辑的行为,称为函数重载(function overload)。TypeScript 对于“函数重载”的类型声明方法是:逐一定义每一种情况的类型,然后还必须对函数给予完整的类型声明
有一些编程语言允许不同的函数参数,对应不同的函数实现。但是,JavaScript 函数只能有一个实现,必须在这个实现当中,处理不同的参数。因此,函数体内部就需要判断参数的类型及个数,并根据判断结果执行不同的操作
注意:重载的各个类型描述与函数的具体实现之间,不能有其他代码,否则报错。另外,虽然函数的具体实现里面,有完整的类型声明。但是,函数实际调用的类型,以前面的类型声明为准。比如,上例的函数实现,参数类型和返回值类型都是number|any[],但不意味着参数类型为number时返回值类型为any[]
重载声明的排序很重要,因为 TypeScript 是按照顺序进行检查的,一旦发现符合某个类型声明,就不再往下检查了,所以类型最宽的声明应该放在最后面,防止覆盖其他类型声明
对象的方法也可以使用重载
函数重载也可以用来精确描述函数参数与返回值之间的对应关系
由于重载是一种比较复杂的类型声明方法,为了降低复杂性,一般来说,如果可以的话,应该优先使用联合类型替代函数重载
构造函数
JavaScript 语言使用构造函数,生成对象的实例。构造函数的最大特点,就是必须使用 new 命令调用