<p>TypeScript 的 public 和 private 是编译期访问修饰符,public 为默认且仅增强可读性,private 提供编译检查并配合 # 编译为 JS 原生私有字段;二者均不改变 JS 运行时行为,需结合 tsconfig 配置与目标环境合理使用。</p>

JavaScript 的 class 本身不支持 public 和 private 关键字(ES2022 才原生支持 # 私有字段),但 TypeScript 在编译期提供了完整的访问修饰符语法,让类的成员权限更清晰、类型更安全。配合使用时,关键在于理解两者的分工:TypeScript 负责编译时检查,JavaScript 运行时按实际语法(如 # 或普通属性)执行。
public 是默认行为,显式声明可增强可读性
TypeScript 中,类成员不加修饰符即为 public,外部、子类、内部均可自由访问和修改。显式写 public 不改变行为,但能明确表达设计意图,尤其在团队协作或大型项目中更利于维护。
- ✅ 正确用法:
public name: string;或直接name: string; - ✅ 实例可读可写:
const p = new Person("Alice"); p.name = "Bob"; - ⚠️ 注意:JS 运行时不会阻止外部修改,
public仅在 TS 编译阶段起约束作用
private 保证编译期隔离,运行时靠 # 实现真正私有
TypeScript 的 private 修饰符禁止在类外部和子类中访问该成员——这纯粹是编译检查。若目标环境支持(如现代浏览器或 Node.js ≥12),TS 会把 private foo: number 编译为 #foo 字段,获得 JS 原生私有性;否则降级为普通属性(但仍有编译报错提醒)。
- ✅ 类内可用:
this.privateId = 1001; - ❌ 外部不可见:
inst.privateId在 TS 中报错,JS 运行时若未编译为#则可能意外访问到(所以务必配对使用 TS 编译 + 合理目标环境) - ? 提示:想兼容老环境又需封装逻辑?用
get/set暴露受控接口,把真正数据设为private
搭配 tsconfig.json 避免常见陷阱
TypeScript 对未初始化的属性检查较严,比如声明了 private id: number; 却没在 constructor 中赋值,会报错。可通过配置放宽限制,但建议优先采用初始化方式。
立即学习“Java免费学习笔记(深入)”;
- ? 推荐初始化:
private id: number = 0;或在 constructor 中this.id = id; - ⚙️ 若必须延迟初始化,可在
tsconfig.json中关闭严格检查:"strictPropertyInitialization": false - ❗ 注意:
private成员不能被子类继承,也不参与instanceof或for...in遍历(尤其是编译为#后)
实际协作建议:用 private 封装状态,用 public 暴露契约
一个健壮的类通常把数据细节设为 private,只通过 public 方法或存取器提供操作入口。这样既满足封装原则,又保留扩展灵活性。
- ? 示例:
private _balance: number = 0;+public getBalance(): number { return this._balance; } - ? 不要直接暴露敏感字段,哪怕它只是
public balance: number; - ? 构造函数参数也可带修饰符(如
constructor(private id: number)),TS 会自动生成并赋值私有属性


















