TypeScript:static readonly静态常量 作者:马育民 • 2025-10-12 22:36 • 阅读:10000 # 介绍 `static readonly` 是一个非常常见且强大的组合,用于定义**类级别的常量**。它结合了 `static` 和 `readonly` 两个关键字的优点,是创建不可变、共享配置和常量的推荐方式。 **注意:**只能修饰类属性,不能修饰变量,否则报错 ### 含义 | 关键字 | 作用 | | :--- | :--- | | **`static`** | 表示该成员属于**类本身**,而不是类的实例。通过 `ClassName.member` 访问。 | | **`readonly`** | 表示该成员是**只读的**,一旦被赋值就不能再修改(编译时检查)。 | 组合起来就是:**不可改变的静态属性** ### 应用场景 **集中管理**:将相关的常量组织在一个类中,便于查找和维护。 **命名空间**:避免全局命名污染。例如 `MathConstants.PI` 比全局的 `PI` 更清晰。 **类型安全**:可以进行类型检查,防止赋值错误。 **不可变性**:`readonly` 确保常量不会被意外修改,提高代码可靠性。 **易于测试和替换**:所有配置集中,方便在不同环境(开发/生产)下替换。 # 基本用法 ```typescript class MathUtils { // ✅ 定义数学常量 static readonly PI: number = 3.1415926 } ``` ### 访问 直接通过 `类名.静态属性名` 访问: ``` console.log(MathUtils.PI) console.log(MathUtils.E) ``` ### 修改报错 ``` MathUtils.PI = 3.14 ``` # 对象常量 **注意:**只读的是引用 班主任类: ```typescript 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` 类 | 见下方示例 | # 总结 * `static readonly` 定义**类级别常量**的标准方式。 * 提供了**集中管理、命名空间、类型安全和不可变性**。 * 适用于配置等场景。 * 在开发中,强烈建议使用 `static readonly` 类来组织应用常量,而不是散落在各处的 `const` 变量。 原文出处:http://malaoshi.top/show_1GW21uvI6UQ0.html