TypeScript 枚举

更新日期: 2019-08-14阅读: 1.9k标签: 枚举

数字类型枚举

常规枚举的值都是数字类型,因此被称为数字类型枚举:

enum Color {
    Red,
    Blue,
    Green
}
console.log(Color.Red);
// 0
console.log(Color[0]);
// Red
console.log(Color[Color.Red]);
// Red, Color.Red = 0


改变与数字枚举关联的数字

默认情况下,第一个枚举值是 0,后续的值会递增。

可以通过赋值的方法修改枚举关联的数字,后续的值会递增,但不会修改之前的值:

enum Color {
    Red, // 0
    Blue = 2, // 2
    Green // 3
}

手动赋值后,出现前面的值被后面的值覆盖了,但是 TypeScript 不会进行报错:

enum Color {
    Red = 1, // 1
    Blue = 0, // 0
    Green // 1
}
console.log(Color['Red'] === 1); // true
console.log(Color['Green'] === 1); // true
console.log(Color[1] === 'Red'); // false
console.log(Color[1] === 'Green'); // true


字符串枚举

枚举的值还可以设置为字符串,当其中一个值赋值为字符串后,后续的值必须要赋值:

enum Color {
    Red, // 0
    Blue = 'Blue', // Blue
    Green = 'Green' // Green
}


常量枚举

常量枚举可以提升些许的性能,在枚举值不会变化的情况下,最好都使用 const 进行声明:

const enum Color {
    Red,
    Blue,
    Green
}
const red = Color.Red;
// 编译成 const red = 0 /* Red */;

常量枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员。

const enum Color {
    Red,
    Blue,
    Green
}
const red = Color.Red;
// 编译成
// var Color;
// (function (Color) {
//     Color[Color["Red"] = 0] = "Red";
//     Color[Color["Blue"] = 1] = "Blue";
//     Color[Color["Green"] = 2] = "Green";
// })(Color || (Color = {}));
// const red = Color.Red;


计算所得项

枚举项有两种类型:常数项(constant member)和计算所得项(computed member)。

前面的例子使用的都是常数项,计算所得项其实就是通过计算才会得到最后的项:

enum Color {
    Red,
    Green,
    Blue = 'blue'.length
}

计算所得项后面的值都需要进行手动赋值,否则会因为无法获得初始值而报错。

当满足以下条件时,枚举成员被当作是常数:

  • 不具有初始化函数并且之前的枚举成员是常数。在这种情况下,当前枚举成员的值为上一个枚举成员的值加 1。但第一个枚举元素是个例外。如果它没有初始化方法,那么它的初始值为 0。
  • 枚举成员使用常数枚举表达式初始化。常数枚举表达式是 TypeScript 表达式的子集,它可以在编译阶段求值。当一个表达式满足下面条件之一时,它就是一个常数枚举表达式:

    • 数字字面量
    • 引用之前定义的常数枚举成员(可以是在不同的枚举类型中定义的)如果这个成员是在同一个枚举类型中定义的,可以使用非限定名来引用
      带括号的常数枚举表达式
    • +, -, ~ 一元运算符应用于常数枚举表达式
    • +, -, *, /, %, <<, >>, >>>, &, |, ^ 二元运算符,常数枚举表达式做为其一个操作对象。若常数枚举表达式求值后为 NaN 或 Infinity,则会在编译阶段报错

所有其它情况的枚举成员被当作是需要计算得出的值。


外部枚举

外部枚举是使用 declare enum 定义的枚举类型:

declare enum Directions {
    Up,
    Down,
    Left,
    Right
}
const directions = [
    Directions.Up,
    Directions.Down,
    Directions.Left,
    Directions.Right
];

// 编译结果
const directions = [
    Directions.Up,
    Directions.Down,
    Directions.Left,
    Directions.Right
];

declare 定义的类型只会用于编译时的检查,编译结果中会被删除。

外部枚举和声明语句一样,常出现在声明文件中。同时使用 declare 和 const 是可以的:

declare const enum Directions {
    Up,
    Down,
    Left,
    Right
}

let directions = [
    Directions.Up,
    Directions.Down,
    Directions.Left,
    Directions.Right
];

// 编译结果
let directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

链接: https://fly63.com/article/detial/4714

用for...in 和Object.keys()枚举对象属性的差异

用for...in循环和Object.keys方法都可以获取对象的属性,那么它们有什么区别呢?getOwnPropertyNames方法输出的结果中还包含了对象的不可枚举属性,可以通过Object.propertyIsEnumerable来判断属性是否可枚举从而对结果进行过滤

PHP实现枚举

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

javascript枚举算法

题目:在1,2,3,4,5 五个数中,我们随机选取 3个数。问有多少种取法?并且把每种取出数的方法列举出来。乍看这道题,其实感觉没什么难度。三个for循环不就解决问题了。

TypeScript-枚举

枚举是对JavaScript标准数据类型集的扩充,常被用来限定在一定范围内取值的场景。在TypeScript中支持数字和字符串的枚举。我们可以用enum来实现。字符串枚举中没有自增的特性,我们在初始化的时候必须给每一个成员都设字符串。

JS模拟实现枚举

在当前的javascript中,并没有枚举这个概念,在某些场景中使用枚举更能保证数据的正确性,减少数据校验过程,下面就介绍一下javascript如何模拟实现枚举效果。

TypeScript 枚举类型用法示例

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

TypeScript 枚举指南

枚举是受 TypeScript 支持的数据类型。枚举允许您定义一组命名常量。使用它们可以更轻松地记录意图或创建一组不同的案例。枚举大多数用于面向对象的编程语言(如 Java 和 C#)中

TS支持数字枚举和基于字符串的枚举

枚举的好处是,我们可以定义一些带名字的常量,而且可以清晰地表达意图或创建一组有区别的用例,TS支持数字的和基于字符串的枚举,首先来看数字枚举

用 JavaScript 编写枚举的最有效方法

假设有这样一个场景,我们需要统计员工的技术栈,目前我们需要标记的技术有 CSS、JavaScript、HTML、WebGL。然后我可以这样写枚举:

前端枚举enum的应用(Element)封装

枚举 Enum是在众多语言中都有的一种数据类型,JavaScript中还没有(TypeScript有)。用来表示一些特定类别的常量数据,如性别、学历、方向、账户状态等,项目开发中是很常用的。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!