TypeScript基础(二)扩展类型-枚举及其位运算

✨ 专栏介绍

TypeScript是一种由微软开发的开源编程语言,它是JavaScript的超集,意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript,使其更适合大型项目和团队开发。

在TypeScript专栏中,我们将深入探讨TypeScript的各个方面,包括语法、类型系统、模块化、面向对象编程等。我们将介绍如何使用TypeScript来构建可维护、可扩展和高效的应用程序。

TypeScript是一种开源的编程语言,它是JavaScript的超集,意味着所有的JavaScript代码都可以在TypeScript中运行。TypeScript添加了静态类型检查和其他一些新特性,以提高代码的可读性、可维护性和可扩展性。
在这里插入图片描述

文章目录

    • ✨ 专栏介绍
    • 引言
    • 字面量类型的问题
    • type类型别名
    • 枚举
    • 枚举的位运算
    • 总结一下
    • 😶 写在结尾


引言

TypeScript中的枚举(Enum)是一种数据类型,用于定义一组具有命名值的常量。枚举可以帮助我们在代码中使用更具有可读性和可维护性的常量。

本文将介绍字面量类型的问题、类型别名的局限以及枚举的优缺点及示例详细说明枚举的用处,以及扩展知识枚举的位运算

字面量类型的问题

字面量类型有一些局限性:

1. 缺乏灵活性:字面量类型只能表示特定的值,无法表示范围或模式。

2. 可读性差:当使用多个字面量类型时,代码可能会变得冗长和难以理解。

3. 可维护性差:逻辑含义和真实的值产生了混淆, 如果需要修改或添加新的字面量值,可能需要在多个地方进行修改。这可能会导致代码维护困难。

例如:

let gender = '男' | '女'

function getUserByGender(g: '男' | '女') {}

这时候就会产生重复代码。

可以用type类型别名规避此问题

type Gender = '男' | '女'
let gender: Gender

function getUserByGender(g: Gender) {}

相比之下,type类型别名在某些情况下可以提供更好的灵活性和可读性。

type类型别名

优点

  • 灵活性type允许我们使用联合、交叉等方式来组合现有的类型,并且可以进行更复杂的类型操作。这使得我们可以更灵活地定义自定义类型。

  • 可读性type可以为类型起一个有意义的别名,使代码更易读和理解。它可以提高代码的可读性和可维护性。

缺点

  • 可维护性:如果使用过度,type可能会导致代码变得复杂和难以维护。当定义了大量复杂的类型别名时,可能需要花费更多的时间来理解和维护代码。

比如上述示例对用户性别进行判断的时候,需要使用真实的值去进行判断。

例如:

type Gender = '男' | '女'
let gender: Gender

function getUserByGender(g: Gender) {
  // 判断用户为男时
  if (user.gender === '男') {}
}

如果有多处地方用到这些判断,进行性别判断时,依然使用的是真实的值,而不是逻辑含义的值。后期如果需要将“男”“女”,改成“先生”“女士”就需要改很多地方。

如果使用枚举的话,就可以避免这种情况。

enum Gender {
  male = '男',
  female = '女'
}

let gender: Gender

function getUserByGender(g: Gender) {
  if(user.gender === g.male) {
    console.log('xxx')
  }
} 

相比之下,枚举提供了一种更简单和直观的方式来定义一组具有命名值的常量。

枚举

使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。

如何定义一个枚举:

在TypeScript中,可以使用关键字enum来定义一个枚举。

enum 枚举名{
    枚举字段1 =1,
    枚举字段2 =2,
    ...
}

以下是一个简单的示例:

enum Direction {
  Up,
  Down,
  Left,
  Right
}

在上面的示例中,我们定义了一个名为Direction的枚举,它包含了四个常量值:UpDownLeftRight。默认情况下,这些常量值会被赋予从0开始递增的数字索引。因此,在这个示例中,Up将被赋值为0,Down将被赋值为1,以此类推。

我们可以使用枚举类型来声明变量,并将其赋值为枚举中的某个常量:

let direction: Direction = Direction.Up;

我们还可以通过索引访问枚举中的常量:

console.log(Direction.Up); // 输出: 0
console.log(Direction[0]); // 输出: "Up"

需要注意的是,在TypeScript中,枚举类型是具有数字和字符串两种形式的。默认情况下,枚举类型是数字形式的。但我们也可以显式地指定每个常量值的数字或字符串:

enum Direction {
  Up = 1,
  Down = 2,
  Left = 3,
  Right = 4
}

enum Color {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE"
}

在上面的示例中,我们分别定义了一个数字形式的枚举Direction和一个字符串形式的枚举Color。我们可以根据实际需求选择使用哪种形式。

枚举还支持一些特殊操作,例如反向映射和常量计算。反向映射允许我们通过枚举值获取对应的名称,常量计算允许我们在枚举中使用表达式来定义常量值。

枚举会出现在编译结果中,编译结果中表现为对象。

编译前:

enum Gender {
	male = '男',
	female = '女'
}

let gender: Gender

gender = Gender.male
gender = Gender.female

编译结果:

var Gender;
(function (Gender) {
    Gender["male"] = "\u7537";
    Gender["female"] = "\u5973";
})(Gender || (Gender = {}));
let gender;
gender = Gender.male;
gender = Gender.female;

优点

  • 1. 可读性: 枚举提供了一种直观的方式来表示一组常量值,并且可以通过名称访问这些常量值。

  • 2. 类型安全: 枚举在编译时会进行类型检查,确保只能使用枚举中定义的常量值。

然而,枚举也有一些局限性:

  • 1. 不能动态扩展:枚举在定义时就确定了所有可能的值,无法在运行时动态添加新的值。

  • 2. 不能进行复杂操作:枚举只能表示一组离散的常量值,无法表示范围或模式。

枚举的位运算

在枚举中,可以使用位运算符来对枚举值进行位运算操作。位运算是一种对二进制数进行操作的方式,它可以对枚举值的各个位进行逻辑运算,从而实现一些特定的功能。

以下是常用的位运算符及其功能:

  1. 按位与(&):将两个操作数的每个对应位进行与运算,结果中每个位都是两个操作数对应位上都为1时才为1,否则为0。

  2. 按位或(|):将两个操作数的每个对应位进行或运算,结果中每个位都是两个操作数对应位上至少有一个为1时才为1,否则为0。

  3. 按位异或(^):将两个操作数的每个对应位进行异或运算,结果中每个位都是两个操作数对应位上不相同时才为1,相同时为0。

  4. 按位取反(~):将操作数的每一位取反。

下面是一个示例说明如何使用枚举和按位运算符来表示和处理权限:

enum Permission {
 Read = 1, // 0001
 Write = 2, // 0010
 Execute = 4, // 0100
 Delete = 8 // 1000
}

let userPermission: Permission = Permission.Read | Permission.Write; // 用户权限:读、写

function hasPermission(permission: Permission, checkPermission: Permission): boolean {
 return (permission & checkPermission) === checkPermission;
}

console.log(hasPermission(userPermission, Permission.Read)); // 输出: true
console.log(hasPermission(userPermission, Permission.Execute)); // 输出: false

在上面的示例中,我们定义了一个名为Permission的枚举,它表示不同的权限。每个权限都使用二进制表示,其中每个位代表一种权限。然后我们声明了一个变量 userPermission,并将其赋值为 Permission.Read | Permission.Write,表示用户具有读和写的权限。

接下来,我们定义了一个名为 hasPermission 的函数,它接受两个参数:permission 表示用户的权限,checkPermission 表示要检查的权限。在函数内部,我们使用按位与运算符 & 来检查用户是否具有指定的权限。如果结果等于要检查的权限,则返回 true;否则返回 false

最后,我们通过调用 hasPermission 函数来检查用户是否具有读和执行的权限。根据上面定义的 userPermission 的值,输出结果分别为 truefalse

通过使用枚举和位运算符,我们可以方便地对多个权限进行组合和判断。这种方式可以简化代码,并提供更灵活和可扩展的权限控制机制。

总结一下

TypeScript中的枚举是一种用于定义一组具有命名值的常量的数据类型。它可以提高代码的可读性和可维护性,并支持数字和字符串两种形式。

type类型别名相对于字面量具有更大的灵活性和可读性,但在某些情况下可能会导致代码变得复杂和难以维护。枚举提供了一种更简单和直观的方式来定义一组常量值,但在动态扩展和复杂操作方面有一些限制。因此,在选择使用type还是枚举时,需要根据具体情况进行判断。

另外,枚举的位运算运用得当时会有奇效。


😶 写在结尾

前端设计模式专栏
在这里插入图片描述
设计模式是软件开发中不可或缺的一部分,它们帮助我们解决了许多常见问题,并提供了一种优雅而可靠的方式来构建应用程序。在本专栏中,我们介绍了所有的前端设计模式,包括观察者模式、单例模式、策略模式等等。通过学习这些设计模式,并将其应用于实际项目中,我们可以提高代码的可维护性、可扩展性和可重用性。希望这个专栏能够帮助你在前端开发中更好地应用设计模式,写出高质量的代码。点击订阅前端设计模式专栏

Vue专栏
在这里插入图片描述
Vue.js是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动和组件化的方式,使开发者能够更轻松地构建交互性强、可复用的Web应用程序。在这个专栏中,我们将深入探讨Vue.js的核心概念、组件开发、状态管理、路由和性能优化等方面的知识。我们将学习如何使用Vue.js构建响应式的用户界面,并探索其强大的生态系统,如Vue Router和Vuex、Pinia。通过学习这些内容,你将能够成为一名熟练的Vue.js开发者,并能够应用这些知识来构建复杂而高效的Web应用程序。点击订阅Vue专栏

JavaScript(ES6)专栏在这里插入图片描述
JavaScript是一种广泛应用于网页开发和后端开发的脚本语言。它具有动态性、灵活性和易学性的特点,是构建现代Web应用程序的重要工具之一。在这个专栏中,我们将深入探讨JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6(ECMAScript 2015)及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。点击订阅JavaScript(ES6)专栏

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

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

相关文章

self-attention(上)李宏毅

B站视频链接 word embedding https//www.youtube.com/watch?vX7PH3NuYW0Q self-attention处理整个sequence,FC专注处理某一个位置的资讯,self-attention和FC可以交替使用。 transformer架构 self-attention的简单理解 a1-a4可能是input也可以作为中…

Python双端队列的3种实现及应用

概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端:队首(front)、队尾(rear),但与队列不同的是,插入…

详解ajax、fetch、axios的区别

众所周知它们都用来发送请求,其实它们区别还蛮大的。这也是面试中的高频题,本文将详细进行讲解。 1. ajax 英译过来是Aysnchronous JavaScript And XML,直译是异步JS和XML(XML类似HTML,但是设计宗旨就为了传输数据&a…

华为面经总结

为了帮助大家更好的应对面试,我整理了往年华为校招面试的题目,供大家参考~ 面经1 技术一面 自我介绍说下项目中的难点volatile和synchronized的区别, 问的比较细大顶堆小顶堆怎么删除根节点CSRF攻击是什么,怎么预防线程通信方式…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

迁移数据mysql到clickhouse

场景: 项目上需要将mysql表中数据迁移到clickhouse。 理论: 借助MaterializeMySQL 说明: 首先该方案实施需要启动mysql的binlog配置否则同步不了,尽管MaterializeMySQL官方说是在实验阶段,不应该在生产上使用&#x…

numpy 广播

现在有两个数组分别为: arr1 [0, 1, 2, 3, 4, 5, 6]arr2 [1] 这两个数组可以进行广播吗? 二维数组广播: arr1 np.arange(0,3).reshape(1,3) array([[0, 1, 2]]) arr2 np.arange(4,7).reshape(3,1) array([[4],[5],[6]])这两个数组可以进行…

电脑单机游戏推荐:嗜血印 BLOODY SPELL 中文版

《嗜血印》该游戏的故事发生在一个充满秘密和恐怖的江湖中。一伙自称为“灵虚教”的神秘组织闯入万法归宗门派,导致天下大乱。妹妹小鲤被掳为人质,同门师兄弟相继遭到毒手。当嗜血咒印打开的那一刻,重识自我的苏夜锦,为了守护自己…

【linux】Ubuntu 22.04.3 LTS截屏

一、快捷键 交互式录屏 ShiftCtrltAltR 交互式截图 Print 对窗口进行截图 AltPrint 截图 ShiftPrint 快捷键可能取决于使用的桌面环境和个人的键盘快捷键设置。如果上述快捷键不起作用,可能需要检查系统设置中的键盘快捷键部分,以了解系统中截图的…

【MATLAB源码-第105期】基于matlab的4PAM调制解调仿真,输出误码率和误符号曲线并且和理论值对比。

操作环境: MATLAB 2022a 1、算法描述 4PAM(4-Pulse Amplitude Modulation,4脉冲幅度调制)是一种数字调制技术,它通过改变载波信号的幅度来表示数据。在4PAM中,载波的幅度可以采用四种不同的水平&#xf…

AcWing 998. 起床困难综合症

原题链接 其实上面这一堆就是想说,输入 n,m以及 n 个数和该数所对应的运算,其中运算包括有 与、或、异或 三种,真正的问题就是在所有不大于 m 的数(非负数)中,对给定的 n 个数都按该数所对应的运算运算一遍…

visi 各版本安装指南

visi下载链接 https://pan.baidu.com/s/1WNksdiChCPebPvRRSVakOA?pwd0531 1.鼠标右键【visi2021(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 visi2021(64bit)】。 2.打开解压后的文件夹,鼠标右击【Setup VISI 2…

竞赛练一练 第27期:GESP和电子学会相关题目练习

GESP一级2023.03_小猫捉老鼠 1. 准备工作 (1)导入背景Room 2; (2)删除默认小猫角色,导入角色Mouse1、Cat 2。 2. 功能实现 (1)点击绿旗,老鼠出现在随机位置; (2)通过键盘的“↑”、“↓”、“←”、“→”键来控制小猫行走,每按一次,移动5步; (3)小猫在…

GoLang:gRPC协议的介绍以及详细教程,从Protocol开始

目录 ​编辑 引言 一、安装相关Go语言库和相关工具 1. 安装Go 2. 安装Protocol Buffers Compiler 2.1 Windows 2.1.1 下载 2.1.2 解压 2.1.3 环境变量 2. macOS 3. Linux 4. 验证安装 3. 安装gRPC-Go 4. 安装Protocol Buffers的Go插件 二、定义服务 三、生成Go…

论文笔记 Understanding Electricity-Theft Behavior via Multi-Source Data

WWW 2020 oral 1 INTRO 1.1 背景 1.1.1 窃电 窃电(electricity theft)指用户为了逃避电费而进行非法操作的一种行为 常用的反窃电方法可分为两类: 基于硬件驱动的反窃电方法 ​​​​​​​电表开盖检测、集中器检测。。。。 硬件驱动的…

腾讯云3年轻量应用服务器2核2G4M和2核4G5M性能测评

腾讯云优惠之轻量应用服务器3年优惠价格表,目前可以买三年的轻量配置为2核2G4M和2核4G5M,2核2G4M价格三年价格540元,2核4G5M带宽三年756元,当然也可以选择购买一年,第二年续费会比较贵,腾讯云轻量2核2G4M服…

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…

不是小米SU7买不起,而是17.58万的银河E8更有性价比

作者 |Amy 编辑 |德新 疯狂的2023年车市已过。这一年,新势力与传统车企自主品牌在新能源战略上多次交锋。 新能源汽车市场不再由新势力独领风骚,传统车企的新能源品牌进步迅猛,增长势头强劲。 以吉利汽车集团为例,2023年其新能…

1-01初识C语言

一、概述 C语言是贝尔实验室的Ken Thompson(肯汤普逊)、Dennis Ritchie(丹尼斯里奇)等人开发的UNIX 操作系统的“副产品”,诞生于1970年代初。 Thompson和Ritchie共同创作完成了Unix操作系统,他们都被称为…