HarmonyOS NEXT鸿蒙开发 ArkTS:static readonly静态常量

介绍

static readonly 是一个非常常见且强大的组合,用于定义类级别的常量。它结合了 static 和 readonly 两个关键字的优点,是创建不可变、共享配置和常量的推荐方式。

注意:只能修饰类属性,不能修饰变量,否则报错

含义

关键字 作用
static 表示该成员属于类本身,而不是类的实例。通过 ClassName.member 访问。
readonly 表示该成员是只读的,一旦被赋值就不能再修改(编译时检查)。

组合起来就是:不可改变的静态属性

应用场景

集中管理:将相关的常量组织在一个类中,便于查找和维护。
命名空间:避免全局命名污染。例如 MathConstants.PI 比全局的 PI 更清晰。
类型安全:可以进行类型检查,防止赋值错误。
不可变性:readonly 确保常量不会被意外修改,提高代码可靠性。
易于测试和替换:所有配置集中,方便在不同环境(开发/生产)下替换。

基本用法

class MathUtils {
  // ✅ 定义数学常量
  static readonly PI: number = 3.1415926
}

访问

直接通过 类名.静态属性名 访问:

console.log(MathUtils.PI)
console.log(MathUtils.E)

修改报错

MathUtils.PI = 3.14

对象常量

注意:只读的是引用

班主任类:

class Teacher {

  name:string = ""
  sex:string = ""

  constructor(name:string,sex:string){
    this.name = name
    this.sex = sex
  }
}

班级类:

class Clazz{

  static readonly wang:Teacher = new Teacher("王老师","男")
}

访问:

// ✅ 合法:读取
console.log("班主任名字:",Clazz.wang.name)

修改 static readonly 对象中的属性值:

// ✅ 合法:修改对象内部的属性
Clazz.wang.age = 31 // 没有编译错误!

与 const 的对比

场景 推荐方式 示例
在函数或块级作用域中定义常量 使用 const const MAX_USERS = 100;
在类中定义属于类的常量 使用 static readonly static readonly MAX_USERS = 100;
定义枚举风格的常量集 使用 const enum 或 static readonly 类 见下方示例

使用 const enum 的替代方案

对于纯字符串/数字常量,const enum 也是一个好选择:

const enum HttpStatus {
  OK = 200,
  NOT_FOUND = 404,
  SERVER_ERROR = 500
}

console.log(HttpStatus.OK); // 200

const enum 的优势是编译后会被内联,不产生运行时对象,更轻量。

在 ArkTS 开发中的实际应用

在 HarmonyOS 应用开发中,static readonly 常用于:

UI 配置常量

// constants/UIConstants.ets
export class UIConstants {
  static readonly PADDING_SMALL: number = 8;
  static readonly PADDING_MEDIUM: number = 16;
  static readonly PADDING_LARGE: number = 24;

  static readonly FONT_SIZE_TITLE: number = 24;
  static readonly FONT_SIZE_BODY: number = 16;

  static readonly COLOR_PRIMARY: ResourceColor = $r("app.color.primary");
  static readonly COLOR_BACKGROUND: ResourceColor = Color.White;
}

路由路径

// constants/Routes.ets
export class Routes {
  static readonly HOME: string = "/home";
  static readonly PROFILE: string = "/profile";
  static readonly SETTINGS: string = "/settings";
}

存储键名

// constants/StorageKeys.ets
export class StorageKeys {
  static readonly USER_TOKEN: string = "user_token";
  static readonly THEME_MODE: string = "theme_mode";
}

总结

  • static readonly 定义类级别常量的标准方式。
  • 提供了集中管理、命名空间、类型安全和不可变性。
  • 适用于配置等场景。
  • 在开发中,强烈建议使用 static readonly 类来组织应用常量,而不是散落在各处的 const 变量。

原文出处:/show_1GW21uvmAlv1.html