1. 为函数定义类型
// 为函数定义类型
let myAdd = (x: number, y: number):number => {
return x + y;
};
写法: (参数1:参数1类型, 参数2:参数2类型, ...):返回值类型 => {}
1.1. 可选参数
通过 ? 表示该参数为可选参数
// 可选参数和默认参数
let myAdd2 = (x: number, y?: number):number => { // 可选参数必须在必选参数后面
return x + (y || 0); // y 是可选参数,如果没有传入,则默认为 0
};
// 参数默认值
let myAdd3 = (x: number, y = 0):number => {
return x + y; // y 是默认参数,如果没有传入,则默认为 0
};
需要注意:可选参数和默认参数要放在必选参数后面。
1.2. 接口定义函数
可以使用接口定义函数,写法与普通定义相同。与普通定义相比,此方式可以用于其他函数进行校验。
// 接口定义函数类型
interface MyAdd {
(x: number, y: number): number; // 函数类型
}
let myAdd4: MyAdd = (x: number, y: number):number => { // 函数类型
return x + y;
};
1.3. 定义剩余参数
剩余参数语法允许函数接受不定数量的参数,并将这些参数表示为一个数组。
写法: ...args: number[] 表示剩余参数,类型为 number[]
// 定义剩余参数
let myAdd5 = (...args: number[]):number => { // 剩余参数必须在必选参数后面
return args.reduce((acc, cur) => acc + cur, 0); // 计算所有参数的和
};
剩余参数与 arguments 对象的区别
- 数组实例:剩余参数数组时一个真正的数组实例,可以直接使用数组的方法。arguments 对象是一个类数组,不可以使用数组方法。
- 包含参数:剩余参数只包含哪些没有对应形参的实参。arguments 对象包含了传给函数的所有实参。
- 附加属性:arguments 对象有一些额外的附加属性,例如 callee 属性。
2. 函数重载
2.1. 定义
函数重载是指在同一个函数名下,有多个函数类型的定义,这些函数类型的定义可以是不同的参数类型和返回值类型。函数重载的目的是为了让函数的调用更加灵活。
可以根据传入的参数类型和返回值类型,自动选择对应的函数类型。函数重载的实现是通过函数重载列表和函数实现来实现的。函数重载列表是一组函数类型的定义。
2.2. 实现
函数实现是一组函数的实现代码。函数重载列表和函数实现的定义顺序是无关的, 但是函数实现的定义顺序必须在函数重载列表的后面。
// 函数重载
function add(x: number, y: number): number; // 函数重载
function add(x: string, y: string): string; // 函数重载
function add(x: any, y: any): any { // 函数实现
return x + y;
}
add(1, 2); // 3
add("1", "2"); // "12"