函数是JavaScript应用程序的基础。 它帮助你实现抽象层,模拟类,信息隐藏和模块。 在TypeScript里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义 行为 的地方。 TypeScript为JavaScript函数添加了额外的功能,让我们可以更容易地使用。
在 TypeScript 中,函数是用于执行特定任务并可能返回结果的代码块。
函数类型
可以为函数定义类型来明确函数的参数类型和返回值类型。
// 有名字的函数
function sum(a: number, b: number): number {
return a + b;
}
// 匿名函数
let mySum = function(x: number, y: number): number {
return x + y; };
这里明确了 sum
函数接受两个 number
类型的参数 a
和 b
,并返回一个 number
类型的值。
书写完整函数类型
函数类型包含两部分:参数类型和返回值类型。 当写出完整函数类型的时候,这两部分都是需要的。
在函数和返回值类型之前使用( =>
)符号。
返回值类型是函数类型的必要部分,如果函数没有返回任何值,必须指定返回值类型为 void
而不能留空。
let mySum: (x: number, y: number) => number =
function(x: number, y: number): number {
return x + y; };
在这段代码中:
let mySum: (x: number, y: number) => number
这部分定义了一个变量mySum
,并指定了它的类型为接受两个number
类型参数并返回number
类型值的函数类型。- 然后通过
function(x: number, y: number): number { return x + y; }
为mySum
变量赋值了一个具体的函数实现。
以参数列表的形式写出参数类型,为每个参数指定一个名字和类型:
let mySum: (a: number, b: number) => number =
function(x: number, y: number): number {
return x + y; };
在这段代码中,虽然函数定义中的参数名 a
、b
与函数实现中的参数名 x
、y
不同,但它们的类型都是 number
,这是匹配的。
TypeScript 在类型检查时关注的是参数的类型,而不是参数的名称。只要参数的类型符合函数类型定义的要求,代码就可以通过类型检查。
在定义函数的类型时,只考虑参数的类型和返回值的类型。
函数中使用的捕获变量不会体现在类型里。 实际上,这些变量是函数的隐藏状态并不是组成API的一部分。
这是因为这些捕获变量属于函数的内部实现细节,对于使用该函数的外部代码来说,并不需要知道这些内部的状态。函数的 API 主要是通过其公开的参数和返回值来与外部进行交互和通信。
示例:
let outerValue = 10;
function myFunction(x: number): number {
let innerValue = 5;
return x + outerValue + innerValue;
}
在上述 myFunction
函数中,outerValue
是捕获的外部变量,innerValue
是函数内部的变量,它们都不会体现在函数的类型 (x: number) => number
中。
推断类型
如果在赋值语句的一边指定了类型,但是另一边没有类型的话,TypeScript编译器会自动识别出类型:
let mySum = function(x: number, y: number): number {
return x + y; };
在这个例子中,mySum
的类型会被推断为 (x: number, y: number) => number
。
可选参数和默认参数
JavaScript里,每个参数都是可选的,可传可不传。 没传参的时候,它的值就是undefined
。
TypeScript里的每个函数参数都是必须的。传递给一个函数的参数个数必须与函数期望的参数个数一致。
在 TypeScript 中,可选参数和默认参数为函数提供了更灵活的参数设置方式。
可选参数
通过在参数名后面添加 ?
来标记参数为可选参数。调用函数时,可以选择不传递该参数。
示例:
function printInfo(name: string, age?: number) {
console.log(`Name: ${
name}, Age: ${
age ?? 'no age'}`);
}
printInfo("张三"); // "Name: 张三, Age: no age"
printInfo("李四", 25); // "Name: 李四, Age: 25"
printInfo("王二", 0); // "Name: 王二, Age: 0"
可选参数必须跟在必须参数后面。
这是为了确保在调用函数时,必需的参数能够按照正确的顺序被传递,而不会因为可选参数的存在导致参数传递的混乱。
默认参数
可以为参数指定一个默认值,如果调用函数时没有传递该参数或传递的值是undefined
时,就会使用默认值。
function printInfo(name: string, age: number = 18) {
console.log(