介绍
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变量。