TS学习3-枚举

目录

  • 1,枚举
  • 2,定义枚举
  • 3,枚举的规则
    • 1,枚举的值可以是字符串或数字,分别称为字符串枚举、数字枚举
    • 2,数字枚举的值会自增
    • 3,枚举会出现在编译结果中,并且数字枚举和字符串枚举,编译结果有差异
    • 4,被数字约束的变量,可以直接赋值为数字
  • 4,最佳实践
  • 5,枚举的位运算

1,枚举

作用:通常用于约束某个变量的取值范围。

虽然字面量+联合类型,也能实现这个作用。但字面量类型不会进入编译结果

let gender: '男' | '女'

编译结果

let gender;

2,定义枚举

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

3,枚举的规则

1,枚举的值可以是字符串或数字,分别称为字符串枚举、数字枚举

字符串枚举

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

数字枚举

enum Level {
    level1 = 1,
    level2 = 2,
    level3 = 3,
}

2,数字枚举的值会自增

第1个默认从 0 开始。

enum Level {
    level1 = 1,
    level2,
    level3 = 5,
    level4,
    level5,
}

相当于

// 数字枚举
enum Level {
    level1 = 1,
    level2 = 2,
    level3 = 5,
    level4 = 6,
    level5 = 7,
}

3,枚举会出现在编译结果中,并且数字枚举和字符串枚举,编译结果有差异

enum Level {
    level1 = 1,
    level2 = 2,
    level3 = '3'
}

编译结果

var Level = {
    1: "level1",
    2: "level2",
    level1: 1,
    level2: 2,
    level3: "3",
};

并且因为会出现在编译结果中,所以可以在 ts 中直接使用

const L: Level = Level.level1

4,被数字约束的变量,可以直接赋值为数字

以上面的例子来说,也可以直接赋值为 1 或 2

const L1: Level = Level.level1
const L2: Level = 1

但赋值为字符串,会报错。

const L3: Level = "3"

4,最佳实践

  • 尽量不要在一个枚举中即出现字符串字段,又出现数字字段。
  • 使用枚举时,尽量使用枚举字段的名称,而不使用真实的值。

以上面的例子来说:

const L: Level = Level.level1

// 不推荐
const L2: Level = 1

5,枚举的位运算

典例:用于控制权限

enum Permisson {
    Read = 1, // 2^0    0001
    Write = 2, // 2^1   0010
    Create = 4, // 2^2  0100
    Delete = 8, // 2^3  1000
}

1,位运算 | 或,表示操作数对应的二进位有一个是 1,则返回 1。比如 0001 | 0010 返回 0011

增加读写权限:

const pReadAndWrite = Permisson.Read | Permisson.Write

2,位运算 & 与,表示操作数对应的二进位都是 1 则返回1。比如 0011 | 0010 返回 0010

判断权限:

function hasPermission(target: Permisson, somePer: Permisson) {
    return (target & somePer) === somePer
}
hasPermission(pReadAndWrite, Permisson.Read) // true
hasPermission(pReadAndWrite, Permisson.Write) // true
hasPermission(pReadAndWrite, Permisson.Create) // false

3,位运算 ^ 异或,表示操作数对应的二进位不相同时才返回 1。比如 0011 | 0010 返回 0001

删除写权限:

let pOnlyRead = pReadAndWrite ^ Permisson.Write

以上。

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

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

相关文章

三分钟快速理解Flink 作业提交流程(包工头的工程之路)

核心组件 我们先来简单了解一下 flink 作业提交涉及到的组件 同时,如果不了解 Yarn 的同学欢迎跳转到这篇文章,了解一下健鑫集团的工程承包流程(doge): 三分钟快速理解Yarn的工作流程 JobManager JobManager 是整个flink作业的管理者 包含 Dispatch…

java 学习一

jdk下载地址 配置环境变量

多项式和Bezier曲线拟合

目录 1. 多项式拟合2. Bezier曲线拟合3. 源码地址 1. 多项式拟合 在曲线拟合中,多项式拟合方法的性能受到三个主要因素的影响:采样点个数、多项式阶数和正则项。 采样点个数 N N N:从Figure 1中可以看出较少的采样点个数可能导致过拟合&…

【Nginx】centos和Ubuntu操作系统下载Nginx配置文件并启动Nginx服务详解

目录 🌷 安装Nginx环境 🍀 centos操作系统 🍀 ubuntu操作系统 🌷 安装Nginx环境 以下是在linux系统中安装Nginx的步骤: 查看服务器属于哪个操作系统 cat /etc/os-release安装 yum: 如果你确定你的系统…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序等等,对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源,时钟源的频率可以设置,设置好以后就周期性的产生定时中…

linux负载均衡 和 系统负载分析笔记

1 负载均衡 1.1 计算负载 1.1.1 PELT算法简介 从Linux3.8内核以后进程的负载计算不仅考虑权重,⽽且跟踪每个调度实体的历史负载情况,该算法称为PELT(Per-entity Load Tracking) 《奔跑吧Linux内核》卷1:基础架构;P505 相关资料…

stack、queue(priority_queue)的模拟实现和deque的简单介绍

stack和queue(priority_queue) 1. 容器适配器 适配器(Adapter):一种用来修饰容器(Containers)或仿函数(Functors)或迭代器(Iterator)接口的东西。 适配器是一种设计模式,该模式将一个类的接口转换成客户希望的另外一个接口。 现实中拿插座来说&#xf…

serverLess

第一步 安装依赖 npm install serverless-devs/s g 第二步 配置秘钥: 第三步 执行终端 执行命令 s config add 选择 alibaba cloud (alibaba) 把对应的ID secret填写,第三个别名可以随便写: serverLess 查看是…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制,可以将数据拷贝存储在不同的节点上。这样,如果一…

Redis底层数据结构之Dict

目录 一、概述二、Dict结构三、Dictht结构四、DictEntry结构五、核心特性 上一篇文章 reids底层数据结构之quicklist 一、概述 Redis 的 Dict 是一个高效的键值对映射数据结构,采用双哈希表实现以支持无锁的渐进式 Rehash,确保扩容或缩容时的高效性能。…

linux autogroup

一:概述 对于linux autogroup的作用,很多同学可能是听说过,但,并未验证过。 考虑下面场景,开两个terminal,T1和T2,在T1中运行进程P1,P1开启9个线程编译代码,在T2中运行…

Datawhale ChatGPT基础科普

根据课程GitHub - datawhalechina/hugging-llm: HuggingLLM, Hugging Future. 摘写自己不懂得一些地方,具体可以再到以上项目地址 LM:这是ChatGPT的基石的基石。 Transformer:这是ChatGPT的基石,准确来说它的一部分是基石。 G…

销售经理与员工:如何展开有效的绩效面谈

在当今竞争激烈的商业环境中,销售经理与员工之间的绩效面谈显得尤为重要。有效的绩效面谈不仅能够提升员工的工作积极性,促进团队的整体绩效,还能够加强销售经理与员工之间的沟通与理解,为企业的发展奠定坚实的基础。本文将探讨销…

7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试

原文链接:7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试 ChatGPT 刚上线的时候我用的很少,还是习惯用 Google。主要还是因为不信任,怕它对我胡说八道。 慢慢的,也没有一个明确的时间…

Linux的学习之路:19、进程信号(1)

摘要 今天这张说一下信号的一部分知识 目录 摘要 一、信号 1、生活角度的信号 2、技术应用角度的信号 3、注意 4、用kill -l命令可以察看系统定义的信号列表 5、信号处理常见方式概览 二、产生信号 1、通过终端按键产生信号 2、调用系统函数向进程发信号 3、由软件…

<前端>Electron-builder为公证后的app打更新信息latest.yml

MacOS下,Electron-builder可以很方便的为测试包app打更新信息(latest-mac.yml)。 但是,正式发布的时候,不可能用测试包app,因为还没有进行公证。如何为公证的app打latest-mac.yml呢。 其实观察latest-mac.y…

FPGA秋招-笔记整理(1)

一、关键路径 关键路径通常是指同步逻辑电路中,组合逻辑时延最大的路径(这里我认为还需要加上布线的延迟),也就是说关键路径是对设计性能起决定性影响的时序路径。也就是静态时序报告中WNS(Worst Nagative Slack&…

Git 核心概念与实操

这里写目录标题 1 版本回退2 工作区、暂存区、本地仓库、远程仓库 1 版本回退 原文链接:https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192 首先 git log 查看提交记录 在Git中,用 HEAD 表示当前版本 上一个版本就是 HEAD^ &#xff…

Linux-进程间通信:System V消息队列

目录 System V IPC概述标识符与IPC Key System V消息队列创建或打开一个消息队列发送消息接收消息控制消息队列1、IPC_STAT2、IPC_SET3、IPC_RMID 查看系统当前的消息队列代码示例 System V IPC(Inter-Process Communication)是一组用于在 Unix-like 操作…

【C语言】手撕二叉树

标题:【C语言】手撕二叉树 水墨不写bug 正文开始: 二叉树是一种基本的树形数据结构,对于初学者学习树形结构而言较容易接受。二叉树作为一种数据结构,在单纯存储数据方面没有 顺序表,链表,队列等线性结构…