在JavaScript中函数是一等公民。有两种常见定义函数的方式,函数声明和函数表达式。函数声明和函数表达式还是有稍微的区别:函数声明有变量提升的作用
// 函数声明(Function Declaration)
function sum(x, y) {
return x + y;
}
// 函数表达式(Function Expression)
let mySum = function (x, y) {
return x + y;
};
函数有输入和输出,要在TS中对齐进行约束。需要把输入和输出考虑到,其中比较简单的定义如下
function sum(x: number, y: number): number {
return x + y;
}
注意:输入多余或者少于参数是不被允许的
使用接口约束函数
可以使用接口的方式来定义一个函数需要符合条件的形状
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
return source.search(subString) !== -1;
}
使用接口来定义函数的目的主要有如下几个方面的好处
1:当一个函数当参数传递的时候,可以清楚知道函数的信息。
2:可以保证以后函数参数个数,返回值类型不改变
函数可选参数
输入多余的参数是不被允许的,但是如果参数使用?,那么表示这个参数是可以不传递的。
注意:带?的参数,写在最后才能被省略,否则会报错
function buildName(firstName: string, lastName?: string) {
if (lastName) {
return firstName + ' ' + lastName;
} else {
return firstName;
}
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');
function buildName(firstName?: string, lastName: string) {
if (firstName) {
return firstName + ' ' + lastName;
} else {
return lastName;
}
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName(undefined, 'Tom');
// index.ts(1,40): error TS1016: A required parameter cannot follow an optional parameter.
参数默认值
ES6中参数支持默认值,TS中同样支持默认值
function buildName(firstName: string, lastName: string = 'Cat') {
return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');
省略参数
//...items 代表省略参数,是一个数组
function push(array: any[], ...items: any[]) {
items.forEach(function(item) {
array.push(item);
});
}
let a = [];
push(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 Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
网友评论