1. 函数声明es6
function add(x:number, y:number):number{ return x + y }
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 } // => 表示函数的定义,左边为输入类型(须要用括号扩起来),右边为输出类型
不管是那种函数定义方式,在传参数时都不能少或者多,若是有可传可不传的参数,请看 可选参数 。 typescript
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 } }
可选参数必须在必选参数后面ui
4. 参数默认值spa
ts 会将有默认值的参数识别为可选参数,此时它能够在必选参数前面,此时传值是须要的,若在必选参数后面能够不用传值,具体以下:rest
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. 剩余参数code
function indexs(a, ...rest) { console.log(rest) } indexs(1, 2, 4, 5) // 2 4 5
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. 重载blog
重载容许一个函数接受不一样数量或类型的参数是作出不一样的处理。
// 实现将一个字符串或数字进行反转的方法 // 为了更精准的表达,输入的是字符串,输出也应该是字符串,数字同理,因此能够重载定义多个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会优先从最前面的函数定义开始匹配,多个函数若是有包含关系,则应该将更精准的定义写在前面!