函数有两种形式,函数声明和函数表达式
函数声明
TypeScript中,形参跟实参的数量要一样
function sum (x: number, y: number): number {
return x + y
}
sum(1, 2 ,3) // Expected 2 arguments, but got 3
sum(1) // Expected 2 arguments, but got 1.ts(2554)
demo1.ts(166, 26): An argument for 'y' was not provided.
函数表达式
let mySum: (x:number, y:number) => number = function (x:number, y:number) {
return x + y
}
TypeScript中,=>要区别与es6中的箭头函数,TypeScript是用来定义函数的,左侧的是输入类型,需要用括号括起来,右边是输出类型
可选参数
在函数的定义之中,允许可选参数,亦可像es6那样添加默认值,但是可选参数必须作为最后一个形参。
function fullName (firstName?: string, lastName: string) {
}
// 报错:A required parameter cannot follow an optional parameter.
function fullName (firstName: string, lastName?: string) {
}
function fullName1 (firstName: string = 'chris', lastName?: string) {
}
function fullName2 (firstName: string, lastName: string = 'bryant') {
}
function fullName3 (firstName: string, lastName?: string = 'bryant') {
} // fullName3 报错:Parameter cannot have question mark and initializer (参数不能同时带有初始化和问号)
剩余参数
在TypeScript中我们依然可以用...rest来定义函数
function push (array: any[], ...items: any[]) {
items.forEach(ele => {
array.push(ele)
})
}
let a = []
push(a, 1, 2 , 3)
console.log(a) // [ 1, 2, 3 ]
重载
有这样的场景,当我们需要一个函数接受不同的参数和类型的时候,我们就需要重载了
function reverse(x: number): number
function reverse(x: string): string
function reverse(x:number | string): number | string {
if (typeof x === 'number') {
return +(x.toString().split('').reverse().join(''))
} else if (typeof x === 'string') {
return x.toString().split('').reverse().join('')
}
}
console.log(reverse(321), reverse('qwer')) // 123 'rewq'