TypeScript - 函数:初学者指南

你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索 TypeScript 函数的世界。如果你之前从未编写过一行代码,也不用担心——我将作为你的友好向导,我们会一步一步地学习。在本教程结束时,你将会惊讶于在 TypeScript 中使用函数能做些什么!

TypeScript - Functions

函数是什么?

在我们深入了解之前,让我们先了解一下函数是什么。可以把函数想象成一个可重用的食谱。就像你按照食谱来烤蛋糕一样,函数是一组在程序中执行特定任务的指令。

下面是在 TypeScript 中的一个简单函数:

function greet(name: string): string {
return `你好,${name}!`;
}

console.log(greet("Alice")); // 输出:你好,Alice!

在这个例子中,greet 是我们的函数。它接收一个 name 作为输入,并返回一个问候信息。参数后面的 : string 和括号后面的 : string 表示这个函数接收一个字符串作为输入并返回一个字符串。

可选参数

有时候,你可能想要让一个参数变为可选的。在 TypeScript 中,你可以通过在参数名后加上 ? 来实现。

function introduce(name: string, age?: number): string {
if (age) {
return `嗨,我是${name},我${age}岁了。`;
} else {
return `嗨,我是${name}。`;
}
}

console.log(introduce("Bob")); // 输出:嗨,我是Bob。
console.log(introduce("Charlie", 30)); // 输出:嗨,我是Charlie,我30岁了。

在这个函数中,age 是可选的。如果提供了它,我们会包含在介绍中;如果没有提供,我们会跳过。

剩余参数

剩余参数允许你将多个参数作为一个数组来处理。就像是说:“我不知道你会给我多少食材,但我会把它们全部用在我的食谱中!”

function makeShake(...fruits: string[]): string {
return `我做了个奶昔,里面有${fruits.join(", ")}。`;
}

console.log(makeShake("香蕉")); // 输出:我做了个奶昔,里面有香蕉。
console.log(makeShake("草莓", "芒果", "奇异果")); // 输出:我做了个奶昔,里面有草莓, 芒果, 奇异果。

...fruits 语法告诉 TypeScript 将所有提供的参数放入一个名为 fruits 的数组中。

默认参数

默认参数就像是有个备用计划。如果有人没有提供值,我们会使用一个默认值。

function orderCoffee(size: string = "中杯", type: string = "拿铁"): string {
return `你点了一杯${size}的${type}。`;
}

console.log(orderCoffee()); // 输出:你点了一杯中杯的拿铁。
console.log(orderCoffee("大杯")); // 输出:你点了一杯大杯的拿铁。
console.log(orderCoffee("小杯", "浓缩咖啡")); // 输出:你点了一杯小杯的浓缩咖啡。

如果你没有指定大小或类型,默认会是一杯中杯的拿铁。多么方便!

匿名函数

匿名函数就像秘密特工——它们没有名字!当你需要一个只用一次的快速函数时,通常会用到它们。

let greet = function(name: string): string {
return `你好,${name}!`;
};

console.log(greet("David")); // 输出:你好,David!

在这里,我们将一个匿名函数赋值给变量 greet。然后我们可以像普通函数一样使用 greet

函数构造器

函数构造器是一种动态创建函数的方法。就像是建造一个可以基于你给它的指令执行任务的机器人。

let multiply = new Function('a', 'b', 'return a * b');

console.log(multiply(4, 5)); // 输出:20

在这个例子中,我们创建了一个可以乘以两个数的函数。最后一个参数总是函数体,其余的是参数名。

递归与 TypeScript 函数

递归是指一个函数调用自身。就像是俄罗斯套娃——每个娃娃都包含一个更小的自己。

function countdown(n: number): void {
if (n <= 0) {
console.log("发射!");
} else {
console.log(n);
countdown(n - 1);
}
}

countdown(3);
// 输出:
// 3
// 2
// 1
// 发射!

这个函数从给定的数字倒数到零。它会不断调用自己,每次调用时数字都会减小,直到达到零。

Lambda 函数

Lambda 函数,也称为箭头函数,是编写函数的一种简写方式。它们就像是函数的短信缩写!

let add = (a: number, b: number): number => a + b;

console.log(add(3, 4)); // 输出:7

这种紧凑的语法对于编写简短、简单的函数尤其有用。

语法变体

TypeScript 提供了多种定义函数的方式。下面是一个总结不同语法的表格:

语法 示例
函数声明 function greet(name: string): string { return你好,${name}!; }
函数表达式 let greet = function(name: string): string { return你好,${name}!; };
箭头函数 let greet = (name: string): string =>你好,${name}!;
对象中的方法 let obj = { greet(name: string): string { return你好,${name}!; } };
异步函数 async function fetchData(): Promise<void> { /* ... */ }

函数重载

函数重载允许你为同一个函数定义多个函数签名。就像是根据你拥有的食材不同,为同一道菜定义多个食谱。

function makeNoise(animal: "cat"): string;
function makeNoise(animal: "dog"): string;
function makeNoise(animal: string): string {
switch(animal) {
case "cat":
return "喵喵";
case "dog":
return "汪汪";
default:
return "未知动物";
}
}

console.log(makeNoise("cat")); // 输出:喵喵
console.log(makeNoise("dog")); // 输出:汪汪

这个函数可以处理不同类型的动物并发出相应的声音。

就是这样!我们今天涵盖了了很多内容,从基本的函数到更高级的概念,如递归和函数重载。记住,学习编码就像学习一门新语言——它需要练习和耐心。不要害怕尝试这些概念并创建你自己的函数。在你意识到之前,你将能够轻松地编写复杂的程序。快乐编码,我们下节课见!

Credits: Image by storyset