HarmonyOS NEXT鸿蒙开发 ArkTS:枚举

提出问题

当变量的值是 红灯 时,打印 红灯停;值是 绿灯 时,打印 绿灯行;值是 黄灯 时,打印 黄灯警示

实现:

let color:string = "红灯";
if( "红灯" == color  ){
    console.log("红灯停");
}else if( "绿灯" == color ){
    console.log("绿灯行");
}else{
    console.log("黄灯警示!");
}

缺点

变量 color 可以是 不合理的值,如:

let color:string = "白灯";

或者

let color:string = "李雷";

解决

使用枚举

枚举介绍

在 ArkTS 中,枚举(Enum)是一种特殊的数据类型,用于定义一组命名的常量集合,使代码更具可读性和可维护性。枚举在鸿蒙应用开发中常用于表示固定的状态、类型或选项集合。

特点

  • 类型安全:枚举成员是特定类型,避免使用魔术数字或字符串导致的错误。
  • 反向映射:数字枚举支持通过值获取成员名称(如 Direction[0] 返回 "Up")。
  • 不可修改:枚举成员的值在定义后不可更改。

通过枚举,可以使代码逻辑更清晰,尤其在处理多状态、多选项的场景中非常实用

应用场景

在有固定的几个值时,就应该用枚举,例子:

  • 学历:博士、硕士、本科、专科

  • 星期:星期一、星期二、星期日

基本枚举定义

枚举通过 enum 关键字定义,默认情况下,枚举成员的值从 0 开始递增:

// 定义枚举
enum Color {
  Red,    // 0
  Green,  // 1
  Yello,  // 2
}

使用

// 使用枚举
let c: Color = Color.Red;
console.log(c); // 输出:0
console.log(Color[0]); // 输出:"Red"

自定义枚举值

可以为枚举成员指定自定义值(数字或字符串):

例子1

// 数字枚举(可指定初始值,后续成员自动递增)
enum Status {
  Success = 200,
  NotFound = 404,
  Error = 500
}

console.log(Status.Success); // 输出:200

例子2

// 字符串枚举(必须为每个成员指定字符串值)
enum Color {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE"
}

console.log(Color.Green); // 输出:"GREEN"

例子3

// 混合类型枚举(不推荐,易混淆)
enum Mixed {
  A,          // 0
  B = "B",
  C = 10,
  D           // 11(基于上一个值递增)
}

常量枚举

使用 const enum 定义常量枚举,编译时会被直接替换为对应的值,减少运行时开销:

const enum Weekday {
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
  Sun
}

let day: Weekday = Weekday.Fri;
console.log(day); // 输出:4(编译后直接替换为 4)

注意:常量枚举不支持反向映射(如 Weekday[4] 会报错)。

枚举在鸿蒙 UI 中的应用

在鸿蒙界面开发中,枚举常用于状态管理或选项控制:

// 定义按钮状态枚举
enum ButtonState {
  Normal,
  Pressed,
  Disabled
}

@Entry
@Component
struct EnumDemo {
  @State currentState: ButtonState = ButtonState.Normal;

  build() {
    Column() {
      Button("点击我")
        .onClick(() => {
          this.currentState = ButtonState.Pressed;
        })
        .backgroundColor(this.getButtonColor())
        .padding(10)
    }
    .padding(20)
  }

  // 根据枚举状态返回对应颜色
  getButtonColor(): string {
    switch (this.currentState) {
      case ButtonState.Normal:
        return "#007DFF";
      case ButtonState.Pressed:
        return "#0051AA";
      case ButtonState.Disabled:
        return "#CCCCCC";
      default:
        return "#007DFF";
    }
  }
}

原文出处:/show_1GW1wi3jZYqT.html