函数的定义
定义几个函数
// 函数定义
function add1(x: number, y: number) {
return x + y
}
let add2 = (x: number, y: number) => number
type Add3 = (x: number, y: number) => number
interface Add4 {
(x: number, y: number): number
}
函数参数的要求
- 函数参数个数必须与定义的一致
add1(1, 2) // false
add1(1, 2, 3) // false
add1(1) // false
- 可选参数必须放到必选参数的后面
function add5(x: number, y?: number) {
return y ? x + y + x
}
// 报错,可选参数后面出现必选参数
function add5(x: number, y?: number, z: number) {
return y ? x + y + x
}
- 必选参数前面的参数的默认值需要传
undefined才会生效,必选参数后面的有默认值的参数,不传undefined默认值也会生效
function add6(x: number, y = 1, z: number, q = 0) {
return x + y + z + q
}
add6(1, undefined, 2) //结果为4
add6(1, 2) //报错
- 剩余参数
...rest
function add7(x: number, ...rest: number[]) {
return x + rest.reduce((pre, cur) => pre + cur)
}
add7(1, 2, 3, 4, 5)
函数重载
如果函数的名称相同,但是函数参数的个数,参数的类型不同,就叫做函数重载,重载的好处就是不用为功能相似的函数选用不同的函数名称,增强代码的可读性
- ts要求先定义所有的函数声明
- 在类型最宽泛的版本中实现函数重载
- ts编译器在函数重载的时候会去查询重载列表,先匹配第一个定义,不符合再往下查找,因此我们把最容易匹配的定义写在最上面
function add8(...rest: number[]): number
function add8(...rest: string[]): string
function add8(...rest: any[]): any {
let first = rest[0]
if(typeof first === 'string') {
return rest.join(')
}
if(typeof first === 'number'){
return rest.reduce((pre, cur) => pre + cur)
}
}
console.log(add8(1, 2, 3)) // 6
console.log(add8('a', 'b', 'c')) // 'abc'