- 函数声明
在JavaScript中,有两种常见的定义函数的方式--函数声明和函数表达式
//函数声明
function sum(x,y) {
return x + y;
}
//函数表达式
let mySum = function(x,y) {
return x + y;
}
在TypeScript中要对函数的输入输出进行约束。
- 函数声明
function sum(x: number, y: number): number {
return x+y;
}
注意:输入多余的(或者少于要求的)参数,是不被允许的
function sum(x: number, y: number): number{
return (x+y)
}
sum(1,2,3) //报错,多一个参数
sum(1) //报错,少一个参数
- 函数表达式
let mySum: (x: number, y: number) => number = function(x: number, y: number): number{
return x+y
}
注意:TypeScript中=>和es6中的=>不同,这里的=>用来表示函数定义,左边是输入类型要用括号括起来,右边是输出类型。
- 用接口定义函数的形状
interface SearchFunc {
(source: string, subString: string): boolean
}
let mySearch: SearchFunc
mySearch = function (soure: string, subString: string) {
return source.search(subString)!==-1
}
- 可选参数
与接口中的可选属性类似,用?表示可选参数
function buildName(firstName: string, lastName?: string){
if(lastName) return firstName + lastName;
else return firstName
}
let tomcat = buildName('tom', 'cat')
let tom = buildName('tom')
注意:可选参数必须接在必选参数后面,也就是说可选参数后面不允许再出现必选参数了。
- 参数默认值
TypeScript会将添加了默认值的参数识别为可选参数
function buildName(firstName: string, lastName: string = 'cat') {
return firstName+lastName
}
let tomcat = buildName('tom', 'cat')
let tom = buildName('tom')
注意:此时就不受 可选参数必须接在必选参数后面 的限制了。
- 剩余参数
es6中可以使用...rest的方式获取函数中的剩余参数
function push(array, ...items) {
items.forEach(function(item){
array.push(item)
})
}
事实上items是一个数组,所以可以用数组类型来定义:
function push(array: any[], ...items: any[]) {
items.forEach(function() {
array.push(item)
})
}
let a = []
push(a, 1, 2, 3)
- 重载
重载允许一个函数接受不同数量或类型的参数时,做出不同的处理。 当要实现一个reverse函数,输入数字123输出数字321,输入字符串'hello'输出字符串'olleh'
- 使用联合类型可以实现:
function reserve(x: number|string): number|string|void {
if(typeOf x === 'number') {
return Number(x.toString().split('').reserve().join(''))
}
else if(typeOf x === 'string') {
return x.toString().split('').reserve().join('')
}
}
这样有一个缺点,不能够精确的表达输入为number时输出也为number,输入为string时输出也为string。 2. 使用重载定义多个reserve
function (x: number): number
function (x: string): string
function (x: number|string): number|string|void {
if(typeOf x === 'number') {
return Number(x.toString().split('').reserve().join(''))
}
else if(typeOf x === 'string') {
return x.toString().split('').reserve().join('')
}
}
注意:TypeScript会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系需要把精确的定义写在前面。