控制结构
在 TypeScript 中,主要包括条件判断、循环、跳转、异常处理等控制流语句。
1. 条件语句
if 语句
根据条件的真值执行代码块。
typescript
let age = 20;
if (age >= 18) {
console.log("成年人");
} else {
console.log("未成年人");
}
else if 语句
用于多个条件判断时。
typescript
let age = 25;
if (age < 18) {
console.log("未成年");
} else if (age >= 18 && age <= 30) {
console.log("年轻人");
} else {
console.log("成年人");
}
switch 语句
根据不同的值执行不同的代码块,常用于多个值的比较。
typescript
let day = 3;
switch (day) {
case 1:
console.log("星期一");
break;
case 2:
console.log("星期二");
break;
case 3:
console.log("星期三");
break;
default:
console.log("未知日期");
}
2. 循环语句
for 循环
最常用的循环语句,适用于已知循环次数的情况。
typescript
for (let i = 0; i < 5; i++) {
console.log(i); // 输出 0, 1, 2, 3, 4
}
for...of 循环
用于遍历数组或类数组对象(如字符串、Map、Set 等)。
typescript
let arr = [1, 2, 3, 4, 5];
for (let num of arr) {
console.log(num); // 输出 1, 2, 3, 4, 5
}
for...in 循环
用于遍历对象的属性(或数组的索引)。
typescript
let person = { name: "Alice", age: 25, city: "Wonderland" };
for (let key in person) {
console.log(key + ": " + person[key]); // 输出 name: Alice, age: 25, city: Wonderland
}
while 循环
在条件为 true 时,执行循环体。适用于循环次数不确定的情况。
typescript
let i = 0;
while (i < 5) {
console.log(i); // 输出 0, 1, 2, 3, 4
i++;
}
do...while 循环
至少执行一次循环体,条件在循环体执行后判断。
typescript
let i = 0;
do {
console.log(i); // 输出 0, 1, 2, 3, 4
i++;
} while (i < 5);
3. 跳转语句
break 语句
用于跳出当前循环或 switch 语句。
typescript
for (let i = 0; i < 5; i++) {
if (i === 3) {
break; // 当 i 等于 3 时跳出循环
}
console.log(i); // 输出 0, 1, 2
}
continue 语句
用于跳过当前循环的剩余部分,继续下一次循环。
typescript
for (let i = 0; i < 5; i++) {
if (i === 3) {
continue; // 跳过 i 等于 3 的这次循环
}
console.log(i); // 输出 0, 1, 2, 4
}
return 语句
用于从函数中返回值并终止函数的执行。
typescript
function add(a: number, b: number): number {
return a + b; // 立即返回结果并结束函数
}
console.log(add(2, 3)); // 输出 5
4. 异常处理
基本语法
在 TypeScript 中,异常处理 机制和 JavaScript 相同,主要通过 try...catch...finally 语句来捕获和处理运行时错误。TypeScript 对异常处理做了一些加强,主要体现在对类型系统的支持上。接下来我将详细解释 TypeScript 中异常处理的各个方面。
typescript
try {
// 尝试执行的代码
} catch (error) {
// 如果在 try 代码块中发生异常,将执行这里的代码
} finally {
// 无论是否发生异常,finally 块的代码都会执行
}
try块 :用于包裹可能发生异常的代码。如果try块中的代码抛出错误,则会跳到catch块处理。catch块 :用于捕获和处理异常。catch块会接收一个参数,这个参数通常是错误对象,可以用来获取异常的详细信息。finally块 :无论是否发生异常,finally块中的代码都会执行。通常用于清理操作,比如关闭文件、数据库连接等。finally是可选的。
示例:
typescript
try {
let result = 10 / 0;
if (!isFinite(result)) {
throw new Error("Division by zero"); // 手动抛出异常
}
} catch (error) {
console.error("发生错误:", error); // 捕获异常并打印错误信息
} finally {
console.log("清理操作:执行结束");
}
捕获错误
在 catch 中捕获的错误通常是一个 Error 对象,但在 TypeScript 中,catch 的参数类型默认为 any,因此你可以访问错误的所有属性(如 message、stack 等)。在 TypeScript 中可以对 catch 中的 error 类型进行进一步的细化,以便更好地利用类型系统。
默认类型:any
typescript
try {
throw new Error("Something went wrong!");
} catch (error) {
console.log(error.message); // 输出: Something went wrong!
}
使用 unknown 类型
在 TypeScript 4.4 之后,catch 参数的类型被默认设置为 unknown,这比 any 更安全。你必须先对错误进行类型检查,才能访问错误对象的属性。
typescript
try {
throw new Error("Something went wrong!");
} catch (error: unknown) {
if (error instanceof Error) {
console.log(error.message); // 安全地访问 message 属性
} else {
console.log("未知错误");
}
}
自定义错误类型
在 TypeScript 中,你可以创建自定义的错误类型,继承内置的 Error 类。这样可以为不同类型的错误提供特定的属性和方法。
示例:创建自定义错误类型
typescript
class ValidationError extends Error {
constructor(message: string) {
super(message);
this.name = "ValidationError"; // 设置错误类型
}
}
function validateAge(age: number) {
if (age < 18) {
throw new ValidationError("年龄必须大于或等于 18 岁");
}
return true;
}
try {
validateAge(16);
} catch (error: unknown) {
if (error instanceof ValidationError) {
console.error(`${error.name}: ${error.message}`);
} else {
console.error("发生未知错误");
}
}
throw 语句
throw 语句用于抛出异常。当某个条件不满足时,可以通过 throw 抛出一个错误,控制流将跳转到 catch 块。
示例:手动抛出错误
typescript
function divide(a: number, b: number): number {
if (b === 0) {
throw new Error("除数不能为零");
}
return a / b;
}
try {
console.log(divide(10, 0)); // 会抛出错误
} catch (error) {
console.error(error.message); // 输出:除数不能为零
}
never 类型与异常
在 TypeScript 中,never 类型表示一种函数不可能成功执行的状态,通常用于描述抛出异常或进入无限循环的函数。使用 never 可以显式告诉 TypeScript 该函数永远不会返回值,因此它在异常处理中也有很重要的作用。
示例:返回 never 类型
typescript
function throwError(message: string): never {
throw new Error(message); // 该函数不会返回,抛出错误后直接退出
}
try {
throwError("这是一个错误");
} catch (error) {
console.error(error.message); // 输出:这是一个错误
}