函数
1. 函数声明
- 函数声明 (Function Declaration)
function add(x:number, y:number):number{
return x + y
}
- 函数表达式 (Function Expression)
let add = function(x:number, y:number):number{
return x + y
}
// 这种定义方式只定义了匿名函数的传参要求,并没有给 add 的参数添加定义,但是这种方式也可以通过编译,由右侧推导出左侧参数定义
let add(x:number, y:number) => number = function(x:number, y:number):number{
return x + y
}
// => 表示函数的定义,左边为输入类型(需要用括号扩起来),右边为输出类型
无论是那种函数定义方式,在传参数时都不能少或者多,如果有可传可不传的参数,请看 可选参数 。
2. 接口定义函数
interface IoFuc{
(x:string, y:string):number
}
let getLoc:IoFuc
getLoc = function(x: string, y: string): number {
return x.indexOf(y)
}
3. 可选参数
用 ? 表示可选参数
function buildName(firstName:string, lastName?:string):string{
if(lastName) {
return firstName + lastName
} else {
return firstName
}
}
可选参数必须在必选参数后面
4. 参数默认值
ts 会将有默认值的参数识别为可选参数,此时它可以在必选参数前面,此时传值是需要的,若在必选参数后面可以不用传值,具体如下:
function buildName(firstName:string, lastName:string = 'tom'):string{
return firstName + lastName
}
buildName('Li')
function buildName(lastName:string = 'tom', firstName:string):string{
return firstName + lastName
}
buildName(undefined, 'Wang')
5. 剩余参数
- es6中 ...rest 获取函数的剩余参数,如下:
function indexs(a, ...rest) {
console.log(rest)
}
indexs(1, 2, 4, 5)
// 2 4 5
- 上面例子中可知,rest是一个数组,我们可以用数组类型来定义它。 rest参数一定是截止到最后一个参数!
function push(array:any[], ...rest:any[]):any[] {
rest.forEach(item => {
array.push(item)
})
}
let arr:any[] = []
push(arr, 1, 2, 3, 'd', 'e', 5)
// arr [1, 2, 3, 'd', 'e', 5]
6. 重载
重载允许一个函数接受不同数量或类型的参数是做出不同的处理。
// 实现将一个字符串或数字进行反转的方法
// 为了更精准的表达,输入的是字符串,输出也应该是字符串,数字同理,所以可以重载定义多个reverseFnc的函数类型
function reverseFnc(x:number):number;
function reverseFnc(x:string):string;
function reverseFnc(x:number|string):number|string{
if(typeof x === 'string') {
return x.split('').reverse().join('')
} else if(typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
}
}
在上述例子中,多次重复定义了reverseFnc函数,前几次属于函数的定义,最后一次属于函数的实现。
typescript会优先从最前面的函数定义开始匹配,多个函数如果有包含关系,则应该将更精准的定义写在前面!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。