控制结构
在 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); // 输出:这是一个错误
}