HarmonyOS中 Enum 和 Const Enum 的区别

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

在鸿蒙(HarmonyOS)开发中,TypeScript/ArkTS 支持 枚举(Enum)常量枚举(Const Enum),两者的核心区别在于编译后的代码生成和运行时行为。以下是详细对比和应用场景:

一、枚举(Enum)

定义与特点
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT'
}

 编译后结果(通过 tscarktsc 编译):

var Direction;
(function (Direction) {
  Direction["Up"] = "UP";
  Direction["Down"] = "DOWN";
  Direction["Left"] = "LEFT";
  Direction["Right"] = "RIGHT";
})(Direction || (Direction = {}));

关键特性

  1. 生成真实对象:编译后会保留枚举对象,可通过 Direction.Up 访问。
  2. 支持反向映射:数字枚举(如 enum Status { Success = 200 })会生成 Status = "Success"
  3. 运行时存在:可在运行时动态访问枚举成员。
适用场景
  • 需要动态访问枚举值(如通过字符串键获取值)。
  • 需要反向映射的数字枚举。
  • 跨文件或跨模块共享枚举定义。

二、常量枚举(Const Enum)

定义与特点
const enum LogLevel {
  Error = 0,
  Warn = 1,
  Info = 2
}

编译后结果

// 无枚举对象生成!直接替换为字面量
console.log(LogLevel.Error); // 编译为 console.log(0);

关键特性

  1. 内联替换:编译时直接替换为字面量,不生成运行时对象。
  2. 无反向映射:即使数字枚举也无法通过值获取键。
  3. 性能优化:减少运行时对象的内存占用。
适用场景
  • 高性能敏感场景(如频繁调用的函数中使用枚举)。
  • 不需要运行时访问枚举定义。
  • 代码体积优化(避免生成额外对象)。

三、核心区别对比

特性枚举(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 ? '平板' : '手表';
}

五、建议

  1. 优先使用常量枚举
    • 性能敏感代码。
    • 不需要运行时枚举信息。
  2. 使用普通枚举
    • 需要动态访问枚举(如 Object.keys(Direction))。
    • 需要反向映射的数字枚举。
    • 跨模块共享枚举定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值