4_TypeScript 条件语句 --[深入浅出 TypeScript 测试]

在 TypeScript 中,条件语句用于根据不同的条件执行不同的代码块。这些语句包括 if 语句、else if 语句、else 语句和 switch 语句。通过使用条件语句,你可以编写出能够根据特定逻辑分支的代码,从而实现更加动态和灵活的功能。

1. if 语句

if 语句是最基本的条件语句,它允许你指定当某个条件为真时要执行的代码块。

let age = 20;

if (age >= 18) {
    console.log("You are an adult.");
}

当然,以下是两个使用 if 语句的 TypeScript 示例,分别展示了简单条件检查和结合类型保护的情况。

示例 1:简单的条件检查

这个例子展示了一个基本的 if 语句,用于根据用户的年龄判断是否允许访问某个功能。

function checkAccess(age: number): void {
    if (age >= 18) {
        console.log("Access granted. You are an adult.");
    } else {
        console.log("Access denied. You must be at least 18 years old.");
    }
}

// 测试示例
checkAccess(20); // 输出 "Access granted. You are an adult."
checkAccess(16); // 输出 "Access denied. You must be at least 18 years old."

在这个例子中,if 语句检查用户提供的年龄是否大于或等于 18。如果条件为真,则打印一条消息表示允许访问;否则,打印另一条消息表示拒绝访问。

示例 2:结合类型保护的 if 语句

这个例子展示了如何在 if 语句中使用类型保护来处理联合类型(Union Types)。这里我们定义了两种动物类型,并编写一个函数来根据传入的对象执行不同的行为。

interface Bird {
    fly(): void;
}

interface Fish {
    swim(): void;
}

function isFish(animal: Fish | Bird): animal is Fish {
    return (animal as Fish).swim !== undefined;
}

function moveAnimal(animal: Fish | Bird): void {
    if (isFish(animal)) {
        animal.swim();
    } else {
        animal.fly();
    }
}

// 创建实例并测试
const bird: Bird = {
    fly() {
        console.log("The bird is flying.");
    }
};

const fish: Fish = {
    swim() {
        console.log("The fish is swimming.");
    }
};

moveAnimal(bird); // 输出 "The bird is flying."
moveAnimal(fish); // 输出 "The fish is swimming."

在这个例子中,isFish 函数是一个用户定义的类型保护,它帮助 TypeScript 编译器理解在 if 语句内部,animal 的具体类型是什么。因此,在 moveAnimal 函数中,我们可以安全地调用 swim()fly() 方法,而不必担心类型错误。

这两个示例展示了 if 语句的基本用法以及它与 TypeScript 类型系统的集成,确保代码既简洁又类型安全。

2. if...else 语句

if...else 语句允许你指定两个可能的代码块:一个是在条件为真时执行,另一个是在条件为假时执行。

let temperature = 30;

if (temperature > 25) {
    console.log("It's hot outside.");
} else {
    console.log("It's cool outside.");
}

当然,以下是两个使用 if...else 语句的 TypeScript 示例,分别展示了基本条件分支和结合类型保护的情况。

示例 1:基本条件分支

这个例子展示了一个简单的 if...else 语句,用于根据天气状况决定是否需要带伞。

function shouldTakeUmbrella(weather: string): void {
    if (weather === "rainy") {
        console.log("It's raining. You should take an umbrella.");
    } else {
        console.log("The weather is nice. No need for an umbrella.");
    }
}

// 测试示例
shouldTakeUmbrella("rainy"); // 输出 "It's raining. You should take an umbrella."
shouldTakeUmbrella("sunny"); // 输出 "The weather is nice. No need for an umbrella."

在这个例子中,if...else 语句检查天气是否为“rainy”。如果是,则建议带上雨伞;否则,告知天气良好,不需要带伞。这是一个非常直观的例子,展示了如何使用 if...else 来处理二元选择。

示例 2:结合类型保护的 if...else 语句

这个例子展示了如何在 if...else 语句中使用类型保护来处理联合类型(Union Types)。这里我们定义了两种动物类型,并编写一个函数来根据传入的对象执行不同的行为。

interface Bird {
    fly(): void;
}

interface Fish {
    swim(): void;
}

function isFish(animal: Fish | Bird): animal is Fish {
    return (animal as Fish).swim !== undefined;
}

function moveAnimal(animal: Fish | Bird): void {
    if (isFish(animal)) {
        animal.swim();
    } else {
        animal.fly();
    }
}

// 创建实例并测试
const bird: Bird = {
    fly() {
        console.log("The bird is flying.");
    }
};

const fish: Fish = {
    swim() {
        console.log("The fish is swimming.");
    }
};

moveAnimal(bird); // 输出 "The bird is flying."
moveAnimal(fish); // 输出 "The fish is swimming."

在这个例子中,isFish 函数是一个用户定义的类型保护,它帮助 TypeScript 编译器理解在 if...else 语句内部,animal 的具体类型是什么。因此,在 moveAnimal 函数中,我们可以安全地调用 swim()fly() 方法,而不必担心类型错误。

这两个示例展示了 if...else 语句的基本用法以及它与 TypeScript 类型系统的集成,确保代码既简洁又类型安全。通过这些例子,你可以看到 if...else 语句是如何用来实现逻辑分支的,无论是简单的二元选择还是更复杂的类型保护场景。

3. if...else if...else 语句

当你有多个条件需要检查时,可以使用 if...else if...else 结构。这使得你可以定义一系列的条件,并依次检查每个条件,直到找到第一个为真的条件并执行相应的代码块。如果没有条件为真,则执行最后的 else 块(如果存在)。

let score = 85;

if (score >= 90) {
    console.log("Grade: A");
} else if (score >= 80) {
    console.log("Grade: B");
} else if (score >= 70) {
    console.log("Grade: C");
} else if (score >= 60) {
    console.log("Grade: D");
} else {
    console.log("Grade: F");
}

当然,以下是两个使用 if...else if...else 语句的 TypeScript 示例。这些示例展示了如何处理多个条件分支,并且涵盖了从简单的逻辑判断到结合类型保护的复杂场景。

示例 1:学生成绩等级评定

这个例子展示了一个 if...else if...else 语句,用于根据学生的分数来评定成绩等级。

function getGrade(score: number): string {
    if (score >= 90) {
        return "A";
    } else if (score >= 80) {
        return "B";
    } else if (score >= 70) {
        return "C";
    } else if (score >= 60) {
        return "D";
    } else {
        return "F";
    }
}

// 测试示例
console.log(getGrade(95)); // 输出 "A"
console.log(getGrade(82)); // 输出 "B"
console.log(getGrade(76)); // 输出 "C"
console.log(getGrade(65)); // 输出 "D"
console.log(getGrade(58)); // 输出 "F"

在这个例子中,if...else if...else 语句检查学生的分数,并根据不同的分数范围返回相应的成绩等级。每个 else if 分支都检查下一个条件,直到找到匹配的条件为止;如果没有一个条件匹配,则执行 else 分支中的代码。

示例 2:处理多种用户角色的访问权限

这个例子展示了如何在 if...else if...else 语句中结合类型保护来处理不同类型的用户角色,并授予相应的访问权限。

interface Admin {
    role: 'admin';
    manageSystem(): void;
}

interface Editor {
    role: 'editor';
    editContent(): void;
}

interface Viewer {
    role: 'viewer';
    viewContent(): void;
}

function getUserRole(user: Admin | Editor | Viewer): void {
    if (user.role === 'admin') {
        user.manageSystem();
    } else if (user.role === 'editor') {
        user.editContent();
    } else {
        user.viewContent();
    }
}

// 创建实例并测试
const adminUser: Admin = {
    role: 'admin',
    manageSystem() {
        console.log("Admin is managing the system.");
    }
};

const editorUser: Editor = {
    role: 'editor',
    editContent() {
        console.log("Editor is editing content.");
    }
};

const viewerUser: Viewer = {
    role: 'viewer',
    viewContent() {
        console.log("Viewer is viewing content.");
    }
};

getUserRole(adminUser);   // 输出 "Admin is managing the system."
getUserRole(editorUser);  // 输出 "Editor is editing content."
getUserRole(viewerUser);  // 输出 "Viewer is viewing content."

在这个例子中,getUserRole 函数接收一个联合类型(Admin | Editor | Viewer)的用户对象,并根据用户的 role 属性执行不同的行为。if...else if...else 语句依次检查用户的角色,并调用相应的方法。这里没有使用显式的类型保护函数,而是直接通过属性 role 来区分不同类型的用户。

这两个示例展示了 if...else if...else 语句的强大之处,它允许你清晰地表达多条件分支逻辑,并且与 TypeScript 的类型系统很好地集成在一起。无论是简单的数值比较还是复杂的类型检查,这种结构都能帮助你编写出逻辑严密、易于维护的代码。

4. switch 语句

switch 语句提供了一种更简洁的方式来处理多条件分支的情况。它将表达式的值与一系列的 case 标签进行匹配,并执行匹配成功的代码块。如果没有匹配成功,则可以选择性地执行 default 块中的代码。

let dayOfWeek = "Wednesday";

switch (dayOfWeek) {
    case "Monday":
        console.log("Start of the week.");
        break;
    case "Tuesday":
        console.log("Second day of the week.");
        break;
    case "Wednesday":
        console.log("Middle of the week.");
        break;
    case "Thursday":
        console.log("Almost weekend.");
        break;
    case "Friday":
        console.log("End of the work week!");
        break;
    default:
        console.log("It's a weekend.");
        break;
}
注意事项:
  • break 关键字:每个 case 块后通常需要使用 break 来防止“贯穿”(fall-through),即执行完一个 case 后继续执行下一个 case 的代码。
  • default 标签:它是可选的,但如果提供了,应该放在所有 case 标签之后。

当然,以下是两个使用 switch 语句的 TypeScript 示例。这些示例展示了如何使用 switch 语句来处理多个条件分支,并且涵盖了从简单的逻辑判断到结合类型保护的复杂场景。

示例 1:根据星期几安排活动

这个例子展示了一个 switch 语句,用于根据当前是星期几来决定当天的活动安排。

function getActivity(day: string): string {
    switch (day.toLowerCase()) {
        case 'monday':
            return "Start of the week. Plan your schedule.";
        case 'tuesday':
            return "Catch up on emails and meetings.";
        case 'wednesday':
            return "Mid-week check-in with team.";
        case 'thursday':
            return "Prepare for end-of-week review.";
        case 'friday':
            return "Finish pending tasks and plan for next week.";
        case 'saturday':
        case 'sunday':
            return "Relax and enjoy the weekend!";
        default:
            return "Invalid day provided.";
    }
}

// 测试示例
console.log(getActivity("Monday"));   // 输出 "Start of the week. Plan your schedule."
console.log(getActivity("Friday"));   // 输出 "Finish pending tasks and plan for next week."
console.log(getActivity("Sunday"));   // 输出 "Relax and enjoy the weekend!"
console.log(getActivity("Holiday"));  // 输出 "Invalid day provided."

在这个例子中,switch 语句检查传入的 day 参数,并根据不同的值返回相应的活动建议。注意我们使用了 toLowerCase() 方法来确保输入不区分大小写。此外,case 'saturday'case 'sunday' 合并在一起,因为它们共享相同的处理逻辑。

示例 2:处理用户输入命令

这个例子展示了如何在 switch 语句中结合类型保护和联合类型来处理用户输入的不同命令。

type Command = 'add' | 'remove' | 'list' | 'exit';

interface AddCommand {
    command: 'add';
    item: string;
}

interface RemoveCommand {
    command: 'remove';
    id: number;
}

interface ListCommand {
    command: 'list';
}

interface ExitCommand {
    command: 'exit';
}

function processCommand(commandData: AddCommand | RemoveCommand | ListCommand | ExitCommand): void {
    switch (commandData.command) {
        case 'add':
            console.log(`Adding item: ${commandData.item}`);
            break;
        case 'remove':
            console.log(`Removing item with ID: ${commandData.id}`);
            break;
        case 'list':
            console.log("Listing all items.");
            break;
        case 'exit':
            console.log("Exiting the application.");
            break;
        default:
            console.log("Unknown command.");
    }
}

// 创建实例并测试
const addCmd: AddCommand = { command: 'add', item: 'Notebook' };
const removeCmd: RemoveCommand = { command: 'remove', id: 42 };
const listCmd: ListCommand = { command: 'list' };
const exitCmd: ExitCommand = { command: 'exit' };

processCommand(addCmd);   // 输出 "Adding item: Notebook"
processCommand(removeCmd); // 输出 "Removing item with ID: 42"
processCommand(listCmd);  // 输出 "Listing all items."
processCommand(exitCmd);  // 输出 "Exiting the application."

在这个例子中,processCommand 函数接收一个联合类型的命令对象,并根据 command 属性执行不同的操作。每个 case 分支处理一种特定的命令类型。这里我们利用了 TypeScript 的类型系统,确保每个命令对象都有正确的结构。

这两个示例展示了 switch 语句的基本用法以及它与 TypeScript 类型系统的集成。通过这些例子,你可以看到 switch 语句是如何用来处理多条件分支逻辑的,无论是简单的字符串匹配还是更复杂的类型检查场景。同时,switch 语句通常比多个 if...else if 更加简洁明了,特别是在有多个离散选项需要处理时。

5. 类型保护与条件语句结合

TypeScript 允许你在条件语句中使用类型保护来缩小联合类型的范围。这可以让你根据条件更精确地处理不同类型的变量。

function padLeft(value: string, padding: string | number) {
    if (typeof padding === "number") {
        return Array(padding + 1).join(" ") + value;
    }
    return padding + value;
}

// 或者使用用户定义的类型保护
interface Bird {
    fly(): void;
}

interface Fish {
    swim(): void;
}

function isFish(animal: Fish | Bird): animal is Fish {
    return (animal as Fish).swim !== undefined;
}

function getFood(animal: Fish | Bird) {
    if (isFish(animal)) {
        animal.swim();
    } else {
        animal.fly();
    }
}

总结

通过合理使用 ifelse ifelseswitch 语句,你可以创建出清晰、易于维护且逻辑严密的代码。同时,结合 TypeScript 的类型系统,如类型保护等功能,可以使你的条件逻辑更加安全和强大。确保在编写条件语句时考虑代码的可读性和性能,避免过多嵌套或复杂的逻辑结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型:名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码? 3.1 工作原理:独热编码背后的机制 3.2 应用:独热编码的优势 四、什么是标签编码? 4.1 工作原理&…

【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理

使用AWS SDK碰到的错误,其实很简单,要装个扩展库 保持如下 Fatal error: Uncaught Aws\Auth\Exception\UnresolvedAuthSchemeException: This operation requests sigv4a auth schemes, but the client currently supports sigv4, none, bearer, sigv4-…

限时特惠,香港服务器,低至53元/年

家人们谁懂啊!香港服务器这价格简直逆天了,居然比内地的还便宜!就拿阿里云来说,人家最低配置的服务器,价格都很难做到这么亲民。 最低配的就不说了,2 核 4G 的配置,应对日常业务稳稳当当&#x…

USB子系统学习(一)USB电气信号

文章目录 1、声明2、USB协议概述3、USB电气信号3.1、USB基础概念3.1.1、低速/全速信号电平3.1.2、高速信号电平 3.2、学习目标3.3、设备断开与连接3.3.1、连接3.3.2、断开 3.4、复位3.5、设备速率识别3.5.1、低速/全速3.5.2、高速 3.6、数据信号3.6.1、低速/全速的SOP和EOP3.6.…

【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门

文章目录 【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门前言一、什么是机器学习?二、机器学习的基本类型1. 监督学习(Supervised Learning)2. 无监督学习(Unsupervised Learning)3. 半监督学习&a…

SQL-Server链接服务器访问Oracle数据

SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …

【C++】矩阵转置问题详解与优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目解析💯第一种实现方式:我的初始做法实现思路优缺点分析 💯第二种实现方式:我的优化做法实现思路优缺点分析 &#x1f4a…

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

信息系统管理工程师教程第2版(2024年最新版)

信息系统管理工程师教程第2版 目录 第 1 章 信息化发展 第 2 章 信息技术发展 第 3 章 信息系统架构 第 4 章 信息系统治理 第 5 章 信息技术服务管理 第 6 章 软件开发过程管理 第 7 章 系统集成实施管理 第 8 章 信息系统运维管理 第 9 章 云服务及其运营…

Science Robotics让软机器人“活”得更久的3D打印!

软机器人硬件在医疗、探索无结构环境等领域有广泛应用,但其生命周期有限,导致资源浪费和可持续性差。软机器人结合软硬组件,复杂组装和拆卸流程使其难以维修和升级。因此,如何延长软机器人的生命周期并提高其可持续性成为亟待解决…

通过Dockerfile来实现项目可以指定读取不同环境的yml包

通过Dockerfile来实现项目可以指定读取不同环境的yml包 1. 挂载目录2. DockerFile3. 运行脚本deploy.sh4. 运行查看日志进入容器 5. 接口测试修改application-dev.yml 6. 优化Dockerfile7. 部分参数解释8. 优化不同环境下的日志也不同调整 Dockerfile修改部署脚本 deploy.sh重新…

AutoSar架构学习笔记

1.AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一个针对汽车行业的软件架构标准,旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元(ECU&#xf…

超越YOLO11!DEIM:先进的实时DETR目标检测

DEIM: DETR with Improved Matching for Fast Convergence arXiv: https://arxiv.org/abs/2412.04234 Project webpage:https://www.shihuahuang.cn/DEIM/ GitHub:https://github.com/ShihuaHuang95/DEIM 1 背景:DETR目标检测框架 目标检…

深入理解 Java 接口的回调机制

前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中的应用场景。 泪崩了,期末…

二、用例图

二、用例图 (一)、用例图的基本概念 1、用例图的定义: 用例图是表示一个系统中用例与参与者关系之间的图。它描述了系统中相关的用户和系统对不同用户提供的功能和服务。 用例图相当于从用户的视角来描述和建模整个系统,分析系统的功能与…

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒; 3. 宏病毒可以感染后缀为.xls的文件;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…

STM32 拓展 低功耗案例3:待机模式 (register)

需求描述 寄存器操作进入待机模式。待机模式的唤醒方式比较有限。我们这次使用WKUP引脚的上升沿唤醒。PA0就是WKUP引脚。 当然PA0仍然需要工作在下拉输入模式,只有这样当按键按下的时候才会有一个上升沿。 由于我们电路中PA0已经连接了LED1,所以要产生…

windows中硬件加速gpu计划开启cpu的使用率居高不下

1.加速gpu计划开启在任务管理器的gpu选项中看不到cuda选项,这给我们进行深度学习训练和推理带来很大影响。 2.开启硬件加速CPU的占用率明显增高,特别用GPU进行实时视频流解码时就不会分配给GPU解码,造成cpu占用居高不下。不利于深度学习训练…

【Go】运行自己的第一个Go程序

运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程,一门新语言从hello world开始,这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…

提升汽车金融租赁系统的效率与风险管理策略探讨

内容概要 在汽车金融租赁系统这个复杂的生态中,提升整体效率是每个企业都渴望达成的目标。首先,优化业务流程是实现高效运行的基础。通过分析目前的流程,找出冗余环节并进行简化,能够帮助企业缩短审批时间,提高客户满…