一、JS的函数
编程语言总少不了函数的。我们先来回顾一下JS中的函数。
// “普通”模样的函数 function add(a, b) { return a + b; } // 用变量保存函数 var procAdd = function (a, b) { return a + b; }
二、TS的函数
TS的函数与JS类似,只不过多了参数类型和返回值类型:
function 函数名(参数列表): 返回值类型 { 函数体 }
其中,参数列表的格式为:
参数1: 类型1, 参数2: 类型2, ..., 参数n: 类型n
将前面的JS版的add函数和procAdd函数改写成TS版,则是:
function add(a: number, b: number): number { return a + b; } var procAdd: (a: number, b: number) => number = function (a: number, b: number): number { return a + b; }
procAdd的定义有些长,其实,它就是我们在【1】中讲过的【var 变量名: 类型 = 值;】,(a: number, b: number) => number就是procAdd的类型。
当然,省略procAdd的类型也是可以的,TS可以自动推断出它的类型。
var procAdd = function (a: number, b: number): number { return a + b; }
如果完整地指定了procAdd的类型,则后面的定义部分可以省略参数的类型:
var procAdd: (a: number, b: number) => number = function (a, b): number { return a + b; }
TS通过procAdd的声明可以准确推断出a、b的类型是number。
三、可选参数与默认参数
3.1 可选参数
我们来看一个来自官网的例子:
function buildName(firstName: string, lastName?: string): string { if (lastName) { return firstName + " " + lastName; } else { return firstName; } }
参数名的后面加问号【?】,表示这个参数是可选的(即,调用函数时可以不提供这个参数)。例如,我可以只提供一个firstName:
var r1 = buildName("Jim"); // 正确
当然,也可以两个参数都提供:
var r2 = buildName("Jim", "Raynor"); // 正确
3.2 默认参数
有的时候,我们需要默认的参数。例如,构建一个复数需要两个实数作为实部和虚部,如果不提供虚部,则认为虚部为零。
class Complex { // 代码 } function buildComplex(a: number, b: number = 0): Complex { // 代码 }
参数b的默认值为零,即buildComplex(a)相当于buildComplex(a, 0)。
四、其他话题
关于TS的函数,还有至少三个话题:
不定参数(参数的个数不固定,类似于C的printf);
Lambda表达式与this;
重载(类似于C++的重载)。
这些话题我近期会和大家讨论。