本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
在鸿蒙(HarmonyOS)开发中,TypeScript/ArkTS 支持 枚举(Enum) 和 常量枚举(Const Enum),两者的核心区别在于编译后的代码生成和运行时行为。以下是详细对比和应用场景:
一、枚举(Enum)
定义与特点
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT'
}
编译后结果(通过 tsc
或 arktsc
编译):
var Direction;
(function (Direction) {
Direction["Up"] = "UP";
Direction["Down"] = "DOWN";
Direction["Left"] = "LEFT";
Direction["Right"] = "RIGHT";
})(Direction || (Direction = {}));
关键特性:
- 生成真实对象:编译后会保留枚举对象,可通过
Direction.Up
访问。 - 支持反向映射:数字枚举(如
enum Status { Success = 200 }
)会生成Status = "Success"
。 - 运行时存在:可在运行时动态访问枚举成员。
适用场景
- 需要动态访问枚举值(如通过字符串键获取值)。
- 需要反向映射的数字枚举。
- 跨文件或跨模块共享枚举定义。
二、常量枚举(Const Enum)
定义与特点
const enum LogLevel {
Error = 0,
Warn = 1,
Info = 2
}
编译后结果:
// 无枚举对象生成!直接替换为字面量
console.log(LogLevel.Error); // 编译为 console.log(0);
关键特性:
- 内联替换:编译时直接替换为字面量,不生成运行时对象。
- 无反向映射:即使数字枚举也无法通过值获取键。
- 性能优化:减少运行时对象的内存占用。
适用场景
- 高性能敏感场景(如频繁调用的函数中使用枚举)。
- 不需要运行时访问枚举定义。
- 代码体积优化(避免生成额外对象)。
三、核心区别对比
特性 | 枚举(Enum) | 常量枚举(Const Enum) |
---|---|---|
编译生成对象 | 是 | 否(直接内联替换) |
反向映射 | 数字枚举支持 | 完全不支持 |
运行时访问 | 可通过枚举名动态访问 | 编译后不存在,无法访问 |
代码体积 | 可能增加(生成额外对象) | 更小(直接替换为值) |
跨模块引用 | 支持 | 需确保枚举定义在编译时可用(可能需合并) |
四、实际示例
1. 枚举(Enum)案例
enum ApiStatus {
Loading = 'LOADING',
Success = 'SUCCESS',
Error = 'ERROR'
}
// 运行时动态使用
function handleStatus(status: ApiStatus) {
if (status === ApiStatus.Loading) {
console.log('加载中...');
}
// 反向映射(仅数字枚举)
// console.log(ApiStatus['LOADING']); // 错误!字符串枚举不支持
}
2. 常量枚举(Const Enum)案例
const enum DeviceType {
Phone = 1,
Tablet = 2,
Watch = 3
}
// 编译后:直接替换为数字
function getDeviceName(type: DeviceType) {
// 编译为:return type === 1 ? '手机' : ...
return type === DeviceType.Phone ? '手机' :
type === DeviceType.Tablet ? '平板' : '手表';
}
五、建议
- 优先使用常量枚举:
- 性能敏感代码。
- 不需要运行时枚举信息。
- 使用普通枚举:
- 需要动态访问枚举(如
Object.keys(Direction)
)。 - 需要反向映射的数字枚举。
- 跨模块共享枚举定义。
- 需要动态访问枚举(如