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);  // 输出:这是一个错误
}
相关推荐
tianchang3 小时前
TS入门教程
前端·typescript
胖方Hale10 小时前
04. Typescript 数组类型
前端·typescript
胖方Hale10 小时前
01. Typescript 基础数据类型
前端·typescript
Kjjia11 小时前
考试过程中校园网突然发力,答案没能保存...我炸了
前端·typescript
隐形喷火龙13 小时前
搭建TypeScript单元测试环境
javascript·typescript·单元测试
khalil1 天前
浅析TS枚举与位运算的结合
前端·typescript
YuShiYue1 天前
pnpm monoreop 打包时 node_modules 内部包 typescript 不能推导出类型报错
javascript·vue.js·typescript·pnpm
前端极客探险家2 天前
前端 Excel 工具组件实战:导入 → 可编辑表格 → 导出 + 样式同步 + 单元格合并
前端·typescript·vue·excel
前端大白话2 天前
前端人速码!10个TypeScript神仙技巧,看完直接拿捏项目实战
前端·javascript·typescript
高木的小天才3 天前
鸿蒙中的并发线程间通信、线程间通信对象
前端·华为·typescript·harmonyos