函数声明
我们知道,在JavaScript中,函数的声明有两种方式,一种是函数声明,另一种是函数表达式。
js
function Fn (x, y) {
return x + y;
}
let myFun = function (x, y) {
return x + y;
}
一个函数有输入和输出,要在TypeScript中进行约束,要考虑输入和输出,都要进行类型定义.
js
function Fn(x:number, y:number):number {
return x + y;
}
分析
函数Fn,接收两个参数,都必须是number类型,输出值也必须是number类型
函数表达式
如果我们写一个简单的函数表达式,可以去这样写:
js
let myFn = function (x: number, y: number): number {
return x + y;
}
这样也是可以通过编译的,不过事实上,上面的代码只是对等号右侧测匿名函数进行了类型的顶底,而等号左边的myFn函数并没有进行定义,只是根据类型推论而推断出来的,如果我们需要添加,可以这样去添加:
js
let myFn: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
}
这里的=>和es6中的=>不一样,这里是用来表示函数的定义.
用接口定义函数的形状
我们也可以使用接口的方式来定义一个需要符合的形状:
js
interface Func {
(x: string, y: any): boolean
}
let myFunc: Func = function (x: string, y:any) {
return y > Number(x) ? true : false;
}
采用函数表达式和接口定义函数类型时,对等号左边进行类型的限制,可以保证以后对函数名赋值时保证参数个数,参数类型,返回值保持不变。
可选参数
上面说到,在接口中定义好函数形状后,参数必须保持一致,不可以多也不可以少,那么如何定义参数可选呢?其实与接口定义可选属性类似,用?表示可选参数,注意,可选参数后面不能出现必选参数
js
let myFn = function (x: number, y?: number): number {
if(y) {
return x + y;
} else {
return x;
}
}
myFn(1) //1
参数默认值
在es6中,我们允许给参数添加默认值,在ts中依然可以. 此时就不受在可选参数必须在必选参数后面的限制了。
js
let myFn = function (x: number, y?: number, z: string = '3', d: number = 5): number {
if(y) {
return x + Number(z) + d;//1 + 4 + 5
} else {
return Number(z) + x;
}
}
myFn(1,2,'4') //10
剩余参数
es6中可以使用...rest来表示剩余参数。下面看一个简单的示例,我们可以看到items是一个数组。
js
function Fn(a, ...items) {
console.log(items);//[2,3,4]
}
Fn(1,2,3,4);
所在,我们在ts中就可以使用数组的形式定义它。
js
function F(a: number, ...items: any[]) {
items.push(a)
}
F(1,2,3,4);
函数重载
重载允许一个函数接受不同数量数量或者类型时,作出不同的处理。有这样一个案例:输入123时输出321,输入abc时,输出cba。这时候我们很容易想到联合类型。
js
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
如果使用函数重载的方式,我们可以这样去写,前面两次是函数的定义,最后一次是函数的实现,优先会从前面开始匹配。
js
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}