# TypeScript 中的枚举

> 原文： [https://howtodoinjava.com/typescript/enums/](https://howtodoinjava.com/typescript/enums/)

在 TypeScript 中，**枚举**是一组命名常量。 尽管它是可选的，但枚举应为**一组命名的相关常量**。 TypeScript 支持传统的枚举和基于字符串的枚举。

## 1）基于字符串的枚举

让我们从基于字符串的枚举开始，因为与传统枚举相比，它们是推荐的方法。 **始终使用基于字符串的枚举**，直到您有充分的理由选择传统的枚举为止。

#### 1.1）语法

枚举语法与其他语言非常相似，例如 Java。

```java
enum AppStatus {

    ACTIVE = 'ACTIVE',
	INACTIVE = 'INACTIVE',
	ONHOLD = 'ONHOLD'

}

```

查看 JavaScript 中**生成的代码**。 它具有一个生成的查找表，如下所示。

```java
var AppStatus;
(function (AppStatus) {
    AppStatus["ACTIVE"] = "ACTIVE";
    AppStatus["INACTIVE"] = "INACTIVE";
    AppStatus["ONHOLD"] = "ONHOLD";
})(AppStatus || (AppStatus = {}));

```

#### 1.2）访问枚举成员值

使用`Enum.member`或`Enum['member']`格式访问枚举成员值。

```java
enum AppStatus {
    ACTIVE = 'ACT',
	INACTIVE = 'INACT',
	ONHOLD = 'HLD'
}

AppStatus.ACTIVE 		//ACT
AppStatus.INACTIVE 		//INACT

AppStatus['ACTIVE']		//ACT

//Never use numbers with string based enums

AppStatus[0]			//undefined

```

#### 1.3）作为函数参数的枚举

要在函数中传递枚举，请声明枚举本身的参数类型。

```java
enum AppStatus {
    ACTIVE = 'ACT',
	INACTIVE = 'INACT',
	ONHOLD = 'HLD'
}

function checkStatus(status: AppStatus): void {

	console.log(status);
}

checkStatus(AppStatus.ONHOLD);

```

## 2）传统的基于数字的枚举

尽管不建议这样做，但您可能会遇到需要的情况。 因此，让我们快速学习。

#### 2.1）语法

语法很简单，很老套。 由于尚未初始化值，因此，转译器会生成查找表，并以数组索引的方式分配值（从零开始，然后为每个成员加一）。

```java
enum AppStatus {
    ACTIVE,			//0
	INACTIVE,		//1
	ONHOLD			//2
}

```

如果要**以其他任何数字**开头，则将其分配给第一个枚举成员。 接下来的所有成员将通过一个一个的递增来获取值。

```java
enum AppStatus {
    ACTIVE = 5,			//5
	INACTIVE,			//6
	ONHOLD				//7
}

```

#### 2.2）访问枚举成员值

由于这些是基于数字的枚举，因此您也可以使用`enum[index_number]`格式以及`Enum.member`或`Enum['member']`格式。

```java
enum AppStatus {
    ACTIVE,
	INACTIVE,
	ONHOLD
}

console.log(AppStatus.ACTIVE);		//0
console.log(AppStatus['INACTIVE']);	//1
console.log(AppStatus[0]);			//ACTIVE

```

#### 2.3）作为函数参数的枚举

要在函数中传递枚举，请声明枚举本身的参数类型。

```java
enum AppStatus {
    ACTIVE,
	INACTIVE,
	ONHOLD
}

function checkStatus(status: AppStatus): void {

	console.log(status);
}

checkStatus(AppStatus.ONHOLD);	//2

```

请在最后一个语句中查看打印的`'2'`值。 在大多数情况下，它不是很有用，因此，首选并推荐基于字符串的枚举。

将我的问题放在评论部分。

学习愉快！