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);  // 输出:这是一个错误
}
相关推荐
前端熊猫7 小时前
省略内容在句子中间
前端·javascript·typescript
禁止摆烂_才浅7 小时前
React全家桶 -【高阶函数/高阶组件/钩子】-【forwardRef、mome、useImperativeHandle、useLayoutEffect】
react.js·typescript
高山我梦口香糖10 小时前
[react] 优雅解决typescript动态获取redux仓库的类型问题
前端·react.js·typescript
乐闻x20 小时前
如何使用 TypeScript 和 Jest 编写高质量单元测试
javascript·typescript·单元测试·jest
Web阿成1 天前
1.学习TypeScript 类型
javascript·typescript
oumae-kumiko1 天前
【JS/TS鼠标气泡跟随】文本提示 / 操作提示
前端·javascript·typescript
Summer_Uncle3 天前
【Vue3学习】setup语法糖中的ref,reactive,toRef,toRefs
前端·vue.js·typescript
瑶琴AI前端3 天前
从0到1实现vue3+vite++elementuiPlus+ts的后台管理系统(一)
前端·typescript·vue3