TypeScript入门:函数参数和函数重载

330 阅读2分钟

函数的定义

定义几个函数

// 函数定义
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
}

函数参数的要求

  1. 函数参数个数必须与定义的一致
add1(1, 2) // false
add1(1, 2, 3) // false
add1(1) // false
  1. 可选参数必须放到必选参数的后面
function add5(x: number, y?: number) {
  return y ? x + y + x
}
// 报错,可选参数后面出现必选参数
function add5(x: number, y?: number, z: number) {
  return y ? x + y + x
}
  1. 必选参数前面的参数的默认值需要传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) //报错
  1. 剩余参数...rest
function add7(x: number, ...rest: number[]) {
  return x + rest.reduce((pre, cur) => pre + cur)
}
add7(1, 2, 3, 4, 5)

函数重载

如果函数的名称相同,但是函数参数的个数,参数的类型不同,就叫做函数重载,重载的好处就是不用为功能相似的函数选用不同的函数名称,增强代码的可读性

  1. ts要求先定义所有的函数声明
  2. 在类型最宽泛的版本中实现函数重载
  3. 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'