TypeScript枚举

1、数字枚举

enum Direction {
    Up,
    Down,
    Left,
    Right,
}
var Direction;
(function (Direction) {
    Direction[Direction["Up"] = 0] = "Up";
    Direction[Direction["Down"] = 1] = "Down";
    Direction[Direction["Left"] = 2] = "Left";
    Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));

可以反向映射

enum AnimalFlags {
  None = 0,
  HasClaws = 1  << 0,
  CanFly = 1 << 1
}

interface Animal {
  flags: AnimalFlags;
  [key: string]: any
}

function printAnimalAbilities(animal: Animal) {
  var animalFlags = animal.flags;
  if(animalFlags & AnimalFlags.HasClaws) {
    console.log('animal has claws')
  }
  if(animalFlags & AnimalFlags.CanFly) {
    console.log('animal has fly')
  }
  if(animalFlags == AnimalFlags.None) {
    console.log('nothing')
  }
}

var animal = { flags: AnimalFlags.None };
printAnimalAblities(animal); // 什么都没有
animal.flags |= AnimalFlags.HasClaws;
printAnimalAblities(animal); // 动物有爪子
animal.flags &= ~AnimalFlags.HasClaws;
printAnimalAblities(animal); // 什么都没有
animal.flags |= AnimalFlags.HasClaws | AnimalFlags.CanFly;
printAnimalAblities(animal); // 动物有爪子,能飞翔

在这里,我们可以进行如下操作。

  • 使用 |= 来添加一个标记。
  • 组合使用&= 和 ~ 来清理一个标记。
  • 使用 | 来合并标记。

1.1 数字枚举和数字类型

TypeScript的枚举是基于数字的,这意味着可以将数字类型赋值给枚举类型的实例

enum Color {
  Red,
  Green,
  Blue
}
let col = Color.Red;
col = 0; // 与Color.Red一样有效

2、字符串枚举

enum Direction {
    Up = "上",
    Down = "下",
    Left = "左",
    Right = "右"
}
var Direction;
(function (Direction) {
    Direction["Up"] = "\u4E0A";
    Direction["Down"] = "\u4E0B";
    Direction["Left"] = "\u5DE6";
    Direction["Right"] = "\u53F3";
})(Direction || (Direction = {}));

3、异构枚举

enum Direction {
    Up,
    Down = "下",
    Left = "左",
    Right = "右"
}
var Direction;
(function (Direction) {
    Direction[Direction["Up"] = 0] = "Up";
    Direction["Down"] = "\u4E0B";
    Direction["Left"] = "\u5DE6";
    Direction["Right"] = "\u53F3";
})(Direction || (Direction = {}));

4、枚举成员

enum Char {
    //const 
    a,
    b = 1 + 3,
    c = Char.a,
    //computed
    d = Math.random(),
    e = "123".length
}
var Char;
(function (Char) {
    //const 
    Char[Char["a"] = 0] = "a";
    Char[Char["b"] = 4] = "b";
    Char[Char["c"] = 0] = "c";
    //computed
    Char[Char["d"] = Math.random()] = "d";
    Char[Char["e"] = "123".length] = "e";
})(Char || (Char = {}));

5、常量枚举

在编译阶段被移除(提高性能)

const enum Month {
    Jan,
    Feb,
    Mar
}

编译:

const enum Month {
    Jan,
    Feb,
    Mar
}
let month = [Month.Jan,Month.Feb,Month.Mar]

编译:

var month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];
const enum Title {
  False,
  True,
  Unkonown
}
const title: Title = Title.False

通过设置--preserveConstEnums,运行时可以使用保留编译后的变量

var Title;
(function (Title) {
    Title[Title["False"] = 0] = "False";
    Title[Title["True"] = 1] = "True";
    Title[Title["Unknown"] = 2] = "Unknown";
})(Title || (Title = {}));
var title = 0 /* False */;

6、有静态方法的枚举

使用enum + namespace的声明方式向枚举类型添加静态方法。我们将静态成员isBusinessDay添加到枚举上。

enum Weekday {
  Monday,
  Tuesday,
  Wednesday,
  Tuseday,
  Friday,
  Saturday,
  Sunday
}

namespace Weekday {
  export function isBusinessDay(day:Weekday) {
    switch(day) {
      case Weekday.Saturday:
      case Weekday.Sunday:
       return false;
      default true;
    }
  }
}
const mon = Weekday.Monday;
const sun = Weekday.Sunday;

console.log(Weekday.isBusinessDay(mon)) //true
console.log(Weekday.isBusinessDay(sun)) //false

7、示例

7.1、创建数组

interface MapItem<TEnum, CnEnum> {
  key: string,
  value: string,
  label: string
}
/**
 * @description: 将 enum 与中文 enum 转换为数组,适合直接输出在 v-for 里
 * @param {TEnum} map
 * @param {CnEnum} mapCn
 * @return {MapItem[]} 返回适合于循环的数组
 *    key:enum 大写的 key
 *    value:传给后端的值
 *    label:中文值
 */
export function convertMap<TEnum, CnEnum>(map: TEnum, mapCn: CnEnum):MapItem<TEnum, CnEnum>[] {
  return Object.keys(mapCn).map(key => {
    return {
      key,
      value: map[key],
      label: mapCn[key]
    }
  })
}

interface ValueLabel {
  [key: string]: string
/**
 * @description: 返回后端的值对应中文的对象
 * @param {TEnum} map
 * @param {CnEnum} mapCn
 * @return {ValueLabel} 后端的值对应中文,例如{ Y: 是, N: 否 }
 */
}
export function convertValueLabel<TEnum, CnEnum>(map: TEnum, mapCn: CnEnum): ValueLabel {
  const valueLabel:ValueLabel = {}
  Object.keys(mapCn).forEach(key => {
    valueLabel[map[key]] = mapCn[key]
  })
  return valueLabel
}

/**
 * @description: 同上,只不过是中文对应英文
 * @param {TEnum} map
 * @param {CnEnum} mapCn
 * @return {ValueLabel} 中文对应后端的值,例如{ 是: Y, 否: N }
 */
export function convertLabelValue<TEnum, CnEnum>(map: TEnum, mapCn: CnEnum): ValueLabel {
  const valueLabel:ValueLabel = {}
  Object.keys(mapCn).forEach(key => {
    valueLabel[mapCn[key]] = map[key]
  })
  return valueLabel
}

7.2、Map

enum E {a,b}
enum F {a = 0, b=1 }
enum G {a='apple',b ='banana'}

let e: E = 3
let f: F = 3
e === f // error

let e1: E.a = 1
let e2: E.b = 1
let e3: E.a = 1
e1 === e3 // true
e1 === e2 // false

7.3、Map

export enum sizeEnum {
  XS = 'XS',
  SM = 'SM',
  MD = 'MD',
  LG = 'LG',
  XL = 'XL',
  XXL = 'XXL',
}

export enum screenEnum {
  XS = 480,
  SM = 576,
  MD = 768,
  LG = 992,
  XL = 1200,
  XXL = 1600,
}

const screenMap = new Map<sizeEnum, screenEnum>()

screenMap.set(sizeEnum.XS, screenEnum.XS)
screenMap.set(sizeEnum.SM, screenEnum.SM)
screenMap.set(sizeEnum.MD, screenEnum.MD)
screenMap.set(sizeEnum.LG, screenEnum.LG)
screenMap.set(sizeEnum.XL, screenEnum.XL)
screenMap.set(sizeEnum.XXL, screenEnum.XXL)

export { screenMap }

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

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

相关文章

CTF靶场搭建及Web赛题制作与终端docker环境部署

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 写在前面 ╔═══════════════════════════════════════════════════…

Servlet---HttpServlet、HttpServletRequest、HttpServletResponseAPI详解

文章目录 HttpServlet基础方法doXXX方法Servlet的生命周期 HttpServletRequest获取请求中的信息获取请求传递的参数获取 query string 里的数据获取form表单里的数据获取JSON里的数据如何解析JSON格式获取数据返回数据 HttpServletResponse设置响应的Header设置不同的状态码设置…

羊大师教你如何有效解决工作中的挑战与压力?

在现代社会&#xff0c;工作问题一直是许多人头疼的难题。无论是从工作压力到职业发展&#xff0c;工作问题不仅会影响个人的心理健康&#xff0c;还可能对整个工作团队的效率和和谐产生负面影响。因此&#xff0c;如何有效解决工作问题成为了每个职场人士都需要面对的挑战。 …

性能测试:系统架构性能优化思路

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题&#xff0c;而在上线后出现了比较严重的性能问题&#x…

sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube&#xff0c;sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

如何训练专属的OCR文字识别模型

1. 背景 在10月24日程序员节&#xff0c;公司决定向每位技术人员发放购物实体卡以示庆祝。然而&#xff0c;手动输入实体卡上的一大串卡密可能是一项繁琐且不那么智能的任务&#xff1b;同时&#xff0c;线上用户在绑定购物卡的时候&#xff0c;同样也是需要手动输入。 基于以…

城市易涝点监测,内涝积水监测仪的作用

近些年城市内涝问题格外突出&#xff0c;市民心中总在担心是不是哪一天自己的家园因为内涝&#xff0c;从而短时间内无法正常生活。并且内涝过后的淤泥可能堆积到路边或者居民住宅区等地&#xff0c;这会影响城市生态环境和公共卫生。 内涝积水监测仪为解决城市内涝问题提供了更…

专业远程控制如何塑造安全体系?向日葵“全流程安全闭环”解析

安全是远程控制的重中之重&#xff0c;作为国民级远程控制品牌&#xff0c;向日葵远程控制就极为注重安全远控服务的塑造。近期向日葵发布了以安全和核心的新版“向日葵15”以及同步发布《贝锐向日葵远控安全标准白皮书》&#xff08;下简称《白皮书》&#xff09;&#xff0c;…

Redis性能压测、监控工具及优化方案

Redis是一款高性能的开源缓存数据库&#xff0c;但是在实际应用中&#xff0c;我们需要对Redis进行性能压测、监控以及优化&#xff0c;以确保其稳定性和高可用性。本文将介绍Redis性能压测、监控工具及优化方案。 01 Redis性能压测 常用的Redis性能压测工具有&#xff1a; …

git的实验:cherry-pick,github对比代码的两种方式

某个commit&#xff0c;比如 c1&#xff0c;&#xff0c;最早是在a分支做的&#xff0c;当被cherry-pick到b分之后&#xff0c;还是一样的revision吗&#xff1f; 实验1&#xff1a;c1被cherry-pick到别的分支后&#xff0c;revision不变对吗&#xff1f;&#xff08;答案是变…

在矩池云使用安装AgentTuning

AgentTuning 是清华大学和智谱AI共同推出的 AI Agent方案。 AgentTuning可以令LLM具备更强大的泛化能力&#xff0c;而且同时保持其通用语言能力&#xff0c;项目中包含的AgentInstruct 数据集和 AgentLM 模型均已开源。 项目地址&#xff1a;https://github.com/THUDM/Agent…

免费图书教材配套资料:Spark大数据技术与应用(第2版)

《Spark大数据技术与应用&#xff08;第2版&#xff09;》课程内容全面介绍了Spark大数据技术的相关知识&#xff0c;内容包含包括Spark概述、Scala基础、Spark编程、Spark编程进阶、Spark SQL结构化数据文件处理、Spark Streaming实时计算框架、Spark GraphX图计算框架、Spark…

OSG文字-HUD显示汉字示例(3)

显示文字是一种非常实用的技术&#xff0c;可以用来把一些重要的文字始终显示在屏幕上。HUD的全称是HeadsUpDisplay&#xff0c;即抬头显示&#xff0c;这种技术最早应用在军事战斗机上。 创建HUD显示的基本步骤如下: <1> 创建一个osg::Camera对象&#xff0c;设置视图、…

接口自动化中cookies的处理技术

一&#xff0c;理论知识 为什么有cookie和session&#xff1f; 因为http协议是一种无状态的协议&#xff0c;即每次服务端接受到客户端的请求时都时一个全新的请求&#xff0c;服务器并不知道客户端的请求记录&#xff0c;session和cookie主要目的就是弥补http的无状态特性 …

shell脚本之循环语句(for、while、untli)

循环语句&#xff1a; 一定要有跳出循环条件 循环条件&#xff1a; 1.已知循环的次数&#xff08;新来十个人&#xff0c;就要新建十个账号 2.未知循环的次数&#xff0c;但是要有跳出循环条件&#xff08;对象生气&#xff0c;要道歉到原谅为止&#xff09; for&#xff…

AI的未来!Salesforce发布2024年全球科技的重要预测

Salesforce领导者处于影响企业的最新趋势、技术和挑战的前线&#xff0c;通过市场分析、客户对话等方面带来专业知识和洞察力。毫无疑问&#xff0c;人工智能是本年度的最热话题&#xff0c;Salesforce关于技术和人工智能的预测值得关注。 生成式AI改变商业未来的方式 01 生…

Centos7安装Cesi(Supervisor集中管理工具)

Background CeSi 是 Supervisor 官方推荐的集中化管理 Supervisor 实例的 Web UI&#xff0c;该工具是用 Python 编写&#xff0c;基于 Flask Web 框架 。Superviosr 自带的 Web UI 不支持跨机器管理Supervisor 进程&#xff0c;功能比较简单&#xff0c;通过 CeSi 可以集中管理…

Android修行手册-POI操作Excel文档

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 &#x1f389;利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏…