定义
可以有名字也可以匿名。还可以赋值给一个变量。
// Named function
function add(x, y) {
return x + y;
}
// Anonymous function
let myAdd = function(x, y) { return x + y; };
函数类型
和接口函数有点类似,函数类型需要定义函数参数名称(形式)和参数类型以及返回值类型。
let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };
类型推论
根据类型推导,如果事先定义了函数类型,赋值的时候函数参数和返回值不用声明类型,这叫做“按上下文归类”
let myAdd4: (x: number, y: number) => number;
myAdd4 = function (x, y) {
return x + y;
};
可选参数、剩余参数和参数默认值
可选参数使用?:。注意可选参数必须放在必传参数后面。即函数参数列表的最后。
默认值直接在参数列表使用 = 赋值。可以使用默认值方式来让参数可选(同样需要放在参数列表最后)
参数名前添加 ... 表示剩余参数,我们通常用一个数组类型来表示剩余参数
// 参数可选
function buildName(firstName: string, lastName?: string) {
// ...
}
// 或者使用默认值的方式来让参数可选(必须放最后)
function buildName2(firstName: string, lastName = "Smith") {
// ...
}
// 剩余参数
function buildName3(firstName: string, ...restName: string[]) {
return firstName + " " + restName.join(" ");
}
函数重载
函数可以只定义接口,重新命名之后来实现重载。
重载函数和实现必须兼容
function consoleSomething(str: string): string;
function consoleSomething(num: number): number;
function consoleSomething(something: any): any {
console.log(something);
return something;
}