解释 TypeScript 中的枚举(enum),如何使用枚举定义一组常量?

ops/2025/3/18 5:11:59/

枚举(Enum)​ 是 TypeScript 中用于定义一组具名常量的核心类型,通过语义化的命名提升代码可读性,同时利用类型检查减少低级错误。

以下从定义方式、使用建议、注意事项三方面深入解析。


一、枚举的定义方式

1. 数字枚举

特性:默认从 0 开始自增,支持手动赋值,支持反向映射(通过值获取键)

// 定义用户状态枚举
enum UserStatus {New,       // 0Active,    // 1Blocked,   // 2Deleted = 404 // 手动赋值
}// 使用示例
const currentStatus: UserStatus = UserStatus.Active;
console.log(currentStatus); // 输出: 1
console.log(UserStatus[1]); // 反向映射输出: "Active"
2. 字符串枚举

特性:每个成员必须显式初始化,无反向映射,适用于需明确语义的场景

// 定义 API 端点枚举
enum ApiEndpoint {Login = "/api/login",UserInfo = "/api/user",Logout = "/api/logout"
}// 使用示例
fetch(ApiEndpoint.Login) // 发起登录请求.then(response => { /*...*/ });
3. 异构枚举(混合类型)

慎用:混合数字和字符串成员,易导致维护问题

enum MixedEnum {A = 1,B = "B_VALUE",C = 2 // 允许但容易引发混乱
}
4. 常量枚举

特性:编译后完全移除,直接内联值,适用于性能敏感场景

const enum Direction {Up = "UP",Down = "DOWN"
}// 编译后 Direction 消失,直接替换为 "UP"/"DOWN"
console.log(Direction.Up); // 输出: "UP"

二、使用建议

1. 优先字符串枚举

理由:避免数字枚举的“魔法值”问题,明确语义且无副作用

// 推荐:字符串枚举明确表示错误类型
enum ErrorType {Timeout = "TimeoutError",Network = "NetworkError"
}// 不推荐:数字枚举需额外注释说明
enum LegacyError {Timeout, // 0-超时错误Network  // 1-网络错误
}
2. 避免数字枚举的陷阱

问题:隐式自增可能导致意外覆盖

enum Problematic {A = 2,B,    // 3(预期外)C = 1,D     // 2(覆盖 A)
}
3. 合理使用常量枚举

场景:高频访问且无需反射的常量,如状态码

const enum HttpCode {OK = 200,NotFound = 404
}if (response.status === HttpCode.OK) { // 编译后直接替换为数字
}
4. 避免过度使用枚举

替代方案:对象常量或联合类型

// 简单键值对场景用对象
const ROLES = {Admin: "admin",User: "user"
} as const;// 有限集合用联合类型
type LogLevel = "debug" | "info" | "error";

三、注意事项

1. 初始化顺序依赖

问题:前置成员未初始化会导致引用错误

enum Cycle {A = B, // Error: B 未定义B = 1
}
2. 运行时存在性

常量枚举:编译后消失,无法通过 Object.keys() 遍历

// 常规枚举可遍历
console.log(Object.keys(UserStatus)); // ["0", "1", "2", "404", "New", ...]// 常量枚举在运行时不存在
console.log(Direction.Up); // 有效
console.log(Direction);    // 编译错误
3. 模块化导出规范

建议:统一导出方式避免混乱

// 正确:显式导出
export enum Color { Red = "#FF0000" }// 正确:统一通过 constants 模块管理
export const enum Sizes { Small = "S" }
4. 避免循环引用

陷阱:跨文件枚举相互引用导致未定义

// file1.ts
import { SecondEnum } from "./file2";
export enum FirstEnum { A = SecondEnum.B }// file2.ts
import { FirstEnum } from "./file1";
export enum SecondEnum { B = FirstEnum.A } // 循环依赖报错

总结

合理使用枚举能显著提升代码质量,但需根据场景选择合适类型。字符串枚举推荐作为默认选择,常量枚举适合性能优化,数字枚举需警惕隐式赋值。

同时注意模块化管理和编译后行为,避免在复杂场景中引入维护负担。


http://www.ppmy.cn/ops/166685.html

相关文章

【Android Studio】解决遇到的一些问题

目录 前言 一、Invalid Gradle JDK configuration found. Open Gradle Settings Change JDK location 报错场景 解决方法 二、adb 不是内部或外部命令,也不是可运行的程序或批处理文件。 报错场景 解决方法 前言 Android Studio的安装过程,可以参…

网络安全常识科普(百问百答)

汪乙己一到店,所有喝酒的人便都看着他笑,有的叫道,“汪乙己,你又监控员工隐私了!”他不回答,对柜里说,“来两个fofa。”便排出三个比特币。他们又故意的高声嚷道,“你一定又在电报群…

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…

用旧的手机搭建 MQTT Broker-Node_red

MQTT Broker搭建 在Android上搭建MQTT所需工具: termux 通过网盘分享的文件:termux-app_v0.118.1+github-debug_armeabi-v7a.apk 链接: https://pan.baidu.com/s/1Iii2szXAc02cKVGdP1EuzQ?pwd=fqsc 提取码: fqsc 在 Termux 中使用 MQTT(Message Queuing Telemetry Trans…

嵌入式/C++笔试面试指南(前言)

在数字化转型与智能硬件快速发展的时代,嵌入式系统与 C 语言作为支撑物联网、人工智能、工业控制等领域的核心技术,正面临着前所未有的人才需求。无论是初入职场的应届生,还是寻求技术突破的从业者,掌握嵌入式开发与 C 编程的核心…

Python爬虫:从人民网提取视频链接的完整指南

无论是用于数据分析、内容提取还是资源收集,Python爬虫都因其高效性和易用性而备受开发者青睐。本文将通过一个实际案例——从人民网提取视频链接,详细介绍如何使用Python构建一个完整的爬虫程序。我们将涵盖从基础的网络请求到HTML解析,再到…

docker搭建elk

文章目录 1.拉取镜像2.ES配置3.logstash配置4.kibana配置5.创建自定义网络6.docker-compose.yml文件7.springboot对接Logstash1.创建一个springboot项目引入主要依赖2.application.yml配置3.resources目录中新增logback-spring.xml4.启动项目,搞点日志5.进入kibana控…

Android Composable 与 View 的联系和区别

在 Android 开发中,‌Composable‌(Jetpack Compose)与‌View‌(传统 View 系统)是两种不同的 UI 构建范式。本文将从核心联系、核心区别、代码实现三方面展开对比,并通过实例代码帮助开发者理解其应用场景…