typescript 中实现只读保护需区分编译时与运行时:readonly 修饰符和 readonly 提供编译期检查,object.freeze() 提供运行时防护,三者常组合使用以增强不可变性。

在 TypeScript 中,可以通过 readonly 修饰符、Readonly 工具类型,以及结合 Object.freeze() 等方式,实现对对象属性的只读保护,从而提升数据不可变性。关键在于区分编译时检查和运行时防护。
用 readonly 修饰类属性或接口字段
这是最直接的编译时保护方式,TypeScript 会在开发阶段阻止对被标记为 readonly 的属性赋值。
- 类中使用:class User { readonly id: number; constructor(id: number) { this.id = id; } } —— 实例创建后无法修改
id - 接口/类型中使用:interface Config { readonly timeout: number; } —— 实现该接口的对象不能写入
timeout - 注意:
readonly不影响嵌套对象的内部属性(即非深层只读),仅作用于该字段本身
用 Readonly 包装整个对象类型
Readonly<t></t> 是内置的泛型工具类型,将类型 T 的所有属性递归转为只读(浅层)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:type SafeUser = Readonly; →
SafeUser类型变量不允许修改name或age - 常用于函数参数,防止意外修改传入对象:function logUser(user: Readonly
) { user.name = 'x'; // ❌ 编译报错 } - 与
readonly不同,它不改变原始类型定义,只生成新类型,适合临时约束
配合 Object.freeze() 提供运行时防护
readonly 和 Readonly<t></t> 只在编译期起作用;若需运行时真正阻止修改(如防止 user.name = 'new' 执行成功),需调用 Object.freeze()。
- const user = Object.freeze({ name: 'Alice', age: 30 }); —— 后续赋值会静默失败(严格模式下抛错)
- TypeScript 能自动推导冻结后对象的类型为
Readonly,所以类型安全也得以延续 - 注意:它只冻结第一层属性,深层对象仍可变;如需深度冻结,需手动递归或借助库(如
immer的freeze模式)
进阶:构造不可变对象的实用模式
实际项目中常组合使用多种方式,构建更健壮的不可变数据流。
- 工厂函数返回冻结对象:function createUser(name: string, age: number): Readonly
{ return Object.freeze({ name, age }); } - 用
as const字面量断言(适用于简单常量):const config = { timeout: 5000, retries: 3 } as const; → 类型为{ readonly timeout: 5000; readonly retries: 3 } - 避免意外解构重赋值:对只读对象解构后,变量仍是可变的,如需保持只读,应显式标注:const { name } = user as const;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










