TypeScript - 控制结构

控制结构

在 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,因此你可以访问错误的所有属性(如 messagestack 等)。在 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);  // 输出:这是一个错误
}
相关推荐
陈进Coding2 小时前
踩坑记录【一】 - String与bytes 的转换
typescript
前端小白从0开始2 小时前
关于前端常用的部分公共方法(二)
前端·vue.js·正则表达式·typescript·html5·公共方法
Jinxiansen02116 小时前
Vue 3 实战:【加强版】公司通知推送(WebSocket + token 校验 + 心跳机制)
前端·javascript·vue.js·websocket·typescript
龚思凯6 小时前
TypeScript 中 typeof 的全面解析:从基础用法到高级技巧
前端·typescript
jstart千语7 小时前
【vue3学习】vue3入门
前端·javascript·vue.js·typescript·vue
struggle202513 小时前
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
数据库·typescript·neo4j
狂炫一碗大米饭19 小时前
如何在 TypeScript 中使用类型保护
typescript
码农之王1 天前
(一)TypeScript概述和环境搭建
前端·后端·typescript
蚂小蚁1 天前
从DeepSeek翻车案例看TypeScript类型体操的深层挑战
typescript·deepseek·trae
在人间耕耘2 天前
鸿蒙应用开发:WebSocket 使用示例
typescript