枚举

// 数值型枚举
enum Direction {
Up = 1,
Down,
Left,
Right,
}
// Up=0
enum Direction {
Up,
Down,
Left,
Right,
}
// 使用枚举
enum Response {
No = 0,
Yes = 1,
}
function respond(recipient: string, message: Response): void {
// ...
}
respond("Princess Caroline", Response.Yes)
// 使用计算量初始化的枚举值之后的枚举值不能没有初始化器
enum E {
A = getSomeValue(),
B, // Error! Enum member must have initializer.
}
// 字符串枚举
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
// 混合型枚举
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}

常量枚举值和计算量枚举值

// 常量枚举值的三种情况
// 1. 枚举中第一个成员,如果不带初始化器,其值为 0。
// E.X is constant:
enum E { X }
// 2. 不带初始化器并且前一个成员为数值型常量,则其值为前一个成员的值加一。
// All enum members in 'E1' and 'E2' are constant.
enum E1 { X, Y, Z }
enum E2 {
A = 1, B, C
}
// 3. 使用常量表达式初始化的枚举值
// 其他情况则属于计算量枚举值
enum FileAccess {
// constant members
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
// computed member
G = "123".length
}

联合枚举和枚举成员类型

// 枚举的所有成员均为常量枚举值时,枚举具有特殊语义
// 常量枚举值是指不带初始化器,或者使用数值常量或字符串常量初始化的枚举值
// 特殊语义1:各个枚举值都是类型
enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Square, // Error! Type 'ShapeKind.Square' is not assignable to type 'ShapeKind.Circle'.
radius: 100,
}
// 特殊语义2:该枚举类型成为各个成员类型的联合类型
enum E {
Foo,
Bar,
}
function f(x: E) {
if (x !== E.Foo || x !== E.Bar) {
// ~~~~~~~~~~~
// Error! This condition will always return 'true' since the types 'E.Foo' and 'E.Bar' have no overlap.
}
}
// 运行期枚举
enum E {
X, Y, Z
}
function f(obj: { X: number }) {
return obj.X;
}
// Works, since 'E' has a property named 'X' which is a number.
f(E);
// 编译期枚举
enum LogLevel {
ERROR, WARN, INFO, DEBUG
}
/**
* This is equivalent to:
* type LogLevelStrings = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
*/
type LogLevelStrings = keyof typeof LogLevel;
function printImportant(key: LogLevelStrings, message: string) {
const num = LogLevel[key];
if (num <= LogLevel.WARN) {
console.log('Log level key is: ', key);
console.log('Log level value is: ', num);
console.log('Log level message is: ', message);
}
}
printImportant('ERROR', 'This is a message');
// 逆向映射
// 枚举中每个成员都是属性名,此外每个成员的值都可以逆向映射到属性名
// 字符串枚举成员不会生成逆向映射
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
// 可能会被编译成
var Enum;
(function (Enum) {
Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a]; // "A"
// 常量枚举
const enum Enum {
A = 1,
B = A * 2
}
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
// 可能会被编译成
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
// 已经存在的枚举值
declare enum Enum {
A = 1,
B,
C = 2
}

TypeScript语言学习笔记(4)枚举的更多相关文章

  1. TypeScript语言学习笔记(1)

    基本类型 // 布尔型(Boolean) let isDone: boolean = false; // 数值型(Number) let decimal: number = 6; let hex: n ...

  2. TypeScript语言学习笔记(2)

    接口 // 在参数类型中定义约束 function printLabel(labelledObj: { label: string }) { console.log(labelledObj.label ...

  3. TypeScript语言学习笔记(3)函数,泛型

    函数 // 具名函数和匿名函数 // Named function function add(x, y) { return x + y; } // Anonymous function let myA ...

  4. C语言学习笔记10-结构体、枚举、联合体

    C语言学习笔记10-结构体.枚举.联合体    待传

  5. Go语言学习笔记三: 常量

    Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...

  6. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. CLR_Via_C#学习笔记之枚举

    CLR_Via_C#学习笔记之枚举 枚举类型(Enum)定义的一组"符号名称/值"配对:因为枚举类型使用程序更容易编写.阅读和维护,而且它是强类型: 枚举是值类型:由System. ...

  9. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

随机推荐

  1. Harbor配置自签名证书,docker login+web https访问,helm chart推送应用

    注:高版本(14以上)docker执行login命令,默认使用https,且harbor必须使用域名,只是用ip访问是不行的. 假设使用的网址是:www.harbor.mobi,本机ip是192.16 ...

  2. linux服务器同时运行两个或多个tomcat

    第一步:条件:配置好jdk,如果没有配置好请看:https://www.cnblogs.com/weibanggang/p/11460537.html 第二步:下载安装tomcat 下载tomcat到 ...

  3. java之aop

    1.AOP:aspect orientied programming 面向切面编程.就是横向编程. 2.面向切面编程是在不改变原有代码的情况下增加新的功能. 3.在spring中面向切面编程有两种应用 ...

  4. C语言--简易词法分析器

    #include <stdio.h>#include <stdlib.h>#include <string.h>int p,m,syn,n,sum;       / ...

  5. python 代码中log表示含义

    log表示以e为底数的对数函数符号.其验证代码如下: a=np.log(np.e )print(a)print(np.e)

  6. Django后台管理admin或者adminx中使用富文本编辑器

    在admin或者adminx后台中使用富文本编辑器 一.建立模型:(安装django-tinymce==2.6.0) from django.db import models from tinymce ...

  7. Python DBUtils 连接池对象 (PooledDB)

    数据处理框架用到 mysql, 需要在多进程中的多线程中使用 mysql 的连接 使用到的模块: DBUtils 实现: 使用 DBUtils 中的 PooledDB 类来实现. 自己写一个类, 继承 ...

  8. 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架

    Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...

  9. 正则 \num 如:\1, \2 匹配的结果

    \num 匹配 num,其中 num 是一个正整数.对所获取的匹配的引用.例如,'(.)\1' 匹配两个连续的相同字符. 例子: 正则:/(a)(b)\1/.此表达式的意思大概是对第一个()匹配结果的 ...

  10. 【RAC】 RAC For W2K8R2 安装--dbca创建数据库(七)

    [RAC] RAC For W2K8R2 安装--dbca创建数据库(七) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...