【面试题】 面试官:说说你对 TypeScript 中枚举类型的理解?应用场景?
一、是什么
枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型
通俗来说,枚举就是一个对象的所有可能取值的集合
在日常生活中也很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就可以看成是一个枚举
枚举的说明与结构和联合相似,其形式为:
enum 枚举名{标识符①[=整型常数],标识符②[=整型常数],...标识符N[=整型常数],
}枚举变量;
复制代码
二、使用
枚举的使用是通过enum
关键字进行定义,形式如下:
enum xxx { ... }
复制代码
声明关键字为枚举类型的方式如下:
// 声明d为枚举类型Direction
let d: Direction;
复制代码
类型可以分成:
数字枚举
字符串枚举
异构枚举
数字枚举
当我们声明一个枚举类型是,虽然没有给它们赋值,但是它们的值其实是默认的数字类型,而且默认从0开始依次累加:
enum Direction {Up, // 值默认为 0Down, // 值默认为 1Left, // 值默认为 2Right // 值默认为 3
}console.log(Direction.Up === 0); // true
console.log(Direction.Down === 1); // true
console.log(Direction.Left === 2); // true
console.log(Direction.Right === 3); // true
复制代码
如果我们将第一个值进行赋值后,后面的值也会根据前一个值进行累加1:
enum Direction {Up = 10,Down,Left,Right
}console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right); // 10 11 12 13
复制代码
字符串枚举
枚举类型的值其实也可以是字符串类型:enum Direction {Up = 'Up',Down = 'Down',Left = 'Left',Right = 'Right'
}console.log(Direction['Right'], Direction.Up); // Right Up
复制代码
如果设定了一个变量为字符串之后,后续的字段也需要赋值字符串,否则报错:
enum Direction {Up = 'UP',Down, // error TS1061: Enum member must have initializerLeft, // error TS1061: Enum member must have initializerRight // error TS1061: Enum member must have initializer
}
复制代码
异构枚举
即将数字枚举和字符串枚举结合起来混合起来使用,如下:
enum BooleanLikeHeterogeneousEnum {No = 0,Yes = "YES",
}
复制代码
通常情况下我们很少会使用异构枚举
本质
现在一个枚举的案例如下:
enum Direction {Up,Down,Left,Right
}
复制代码
通过编译后,javascript
如下:
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 = {}));
复制代码
上述代码可以看到, Direction[Direction["Up"] = 0] = "Up"
可以分成
- Direction["Up"] = 0
- Direction[0] = "Up"
所以定义枚举类型后,可以通过正反映射拿到对应的值,如下:
enum Direction {Up,Down,Left,Right
}console.log(Direction.Up === 0); // true
console.log(Direction[0]); // Up
复制代码
并且多处定义的枚举是可以进行合并操作,如下:
enum Direction {Up = 'Up',Down = 'Down',Left = 'Left',Right = 'Right'
}enum Direction {Center = 1
}
复制代码
编译后,js
代码如下:
var Direction;
(function (Direction) {Direction["Up"] = "Up";Direction["Down"] = "Down";Direction["Left"] = "Left";Direction["Right"] = "Right";
})(Direction || (Direction = {}));
(function (Direction) {Direction[Direction["Center"] = 1] = "Center";
})(Direction || (Direction = {}));
复制代码
可以看到,Direction
对象属性回叠加
三、应用场景
就拿回生活的例子,后端返回的字段使用 0 - 6 标记对应的日期,这时候就可以使用枚举可提高代码可读性,如下:
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
复制代码
包括后端日常返回0、1 等等状态的时候,我们都可以通过枚举去定义,这样可以提高代码的可读性,便于后续的维护
给大家推荐一个实用面试题库
1、前端面试题库 (面试必备) 推荐:★★★★★
地址:前端面试题库
【面试题】 面试官:说说你对 TypeScript 中枚举类型的理解?应用场景?相关推荐
- 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer
一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...
- 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???
华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...
- 面试官让我讲讲Java中的锁,我笑了
转载自 面试官让我讲讲Java中的锁,我笑了 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁 ...
- 今天来谈谈面试官最喜欢问JS中的闭包问题吧
今天来谈谈面试官最喜欢问JS中的闭包问题吧 1.什么是闭包? 闭包是指有权访问另外一个函数作用域中的变量的函数,闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在.闭包就是函数的&qu ...
- TypeScript笔记(4)—— TypeScript中的类型注解
TypeScript(4):类型注解 [导读]JavaScript是若类型语言,而TypeScript里的类型注解是一种轻量级的为函数或变量添加约束的方式,为我们提供了静态类型分析能力,这样我们就可以 ...
- TypeScript 中的类型兼容性
Typescript 乃 JavaScript 子集.只要设置一下编译器为非严格模式,那么所有 JavaScript 代码皆是合法的 TypeScript 代码.为了可以适应不同的场景 TypeScr ...
- 面试官 | 如何在 Spring Boot 中进行参数校验?
作者 | 狂乱的贵公子 来源 | cnblogs.com/cjsblog/p/8946768.html 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还 ...
- 面试官:你知道Java中的回调机制吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:22j.co/cFPf 正文 调用和 ...
- 《如何与面试官处朋友》系列-缓存击穿、穿透、雪崩场景原理大调解
前面我们提到分布式多级缓存架构的全貌,但总感觉少了些什么东西.在这样大的场景下面,如果遇到缓存使用问题那可咋办?但自古英雄出少年,相信此刻你已踏马西去,正走在寻找答案上得夕阳西下.每每面谈Redis大 ...
最新文章
- kvm虚拟化技术下虚拟机磁盘的数据保护
- python语言if语句-Python在if语句中等同于(logical-and)
- 《机器学习实战》chapter04 使用Python进行文本分类
- 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
- multiselect多选下拉框
- SQL-10 获取所有非manager的员工emp_no
- 拳王公社:知识付费项目!个体操作可年入千万!简单可复制!
- 完全弄懂如何用pycharm安装pyqt5及其相关配置
- mybatis-generator一些注意点 2021-04-21
- Go语言反射之反射调用
- java电表抄表器接口_远程抄表系统接线图和远程抄表电表安装图及实例
- 画直线的算法之DDA算法+代码实现(法一)
- Python:实现monte carlo蒙特卡罗算法(附完整源码)
- 微信小程序中base64转换成图片
- Sybil_attack (女巫攻击)
- kafka如何选择分区数及kafka性能测试
- 保险项目核保的规则和所负责业务的逻辑
- mysql mmm 虚拟ip不通_mysql-mmm故障解决一例
- 详解go中的混合锁 - mutex
- 【cocos2dx 3.3 lua】04 纸牌翻转效果--类似QQ斗地主癞子效果
热门文章
- CTS 问题 第二篇
- 深入RUST标准库内核(三)NonNull<T>/Unique<T>/mem::replace/Layout/GlobalAlloc
- 1024 | 第一波程序员日福利
- IT项目管理主要知识点
- python常用package下载地址
- 最新水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用丨SWMM排水管网水力、水质建模及海绵与水环境应用
- java生成主键id,java自定义主键生成器
- 罗技MX KEYS/MX anywhere3 第二台设备搜索不到/无法连接的解决办法
- MSIUninstaller.exe(控制台应用程序)
- android 两张电信_天翼副号app下载