typescript 中的访问修饰符
在 TypeScript 中,访问修饰符(Access Modifiers)用于控制类成员的可见性和访问权限,增强代码的封装性和安全性。主要修饰符包括 public
、private
和 protected
,它们定义了成员在不同作用域的可访问性。
1. API 定义
访问修饰符在 TypeScript 中作为类成员的前缀关键字使用,它们定义了成员的访问范围:
public:默认修饰符。成员在任何地方可访问(包括类内部、实例、派生类和其他代码)。
private:成员只能在声明它的类内部访问,不能在实例、派生类或外部代码中直接访问。
protected:成员可以在声明它的类及其派生类中访问,但不能在外部代码或非派生类中访问。
默认行为:如果不显式指定修饰符,成员默认为
public
,但作用域等同于包内公开(同包可访问),包外私有(仅类内可访问)。
这些修饰符在编译时由 TypeScript 编译器处理,但在 JavaScript 运行时无等效语法,需通过闭包或约定模拟。
2. 具体使用方式
通过代码示例演示每个修饰符的用法。假设我们有一个基类 Person
和一个派生类 Employee
,展示不同修饰符的访问限制。
示例代码:
class Person {// public 成员:默认,任何地方可访问public name: string;// private 成员:仅类内部可访问private id: number;// protected 成员:类内部及派生类可访问protected age: number;constructor(name: string, id: number, age: number) {this.name = name;this.id = id;this.age = age;}// public 方法:可外部调用public displayInfo(): void {console.log(`Name: ${this.name}, ID: ${this.id}, Age: ${this.age}`);}// private 方法:仅类内部使用private logId(): void {console.log(`ID: ${this.id}`);}
}class Employee extends Person {constructor(name: string, id: number, age: number) {super(name, id, age);}public showAge(): void {// protected 成员在派生类中可访问console.log(`Age: ${this.age}`);// private 成员在派生类中不可访问(编译错误)// console.log(this.id); // Error: Property 'id' is private and only accessible within class 'Person'[^5]}
}// 测试访问修饰符
const person = new Person("Alice", 1001, 30);
person.displayInfo(); // 输出: Name: Alice, ID: 1001, Age: 30(public 方法可访问)// public 成员可外部访问
console.log(person.name); // 输出: Alice// private 成员外部访问报错
// console.log(person.id); // Error: Property 'id' is private and only accessible within class 'Person'[^3]// protected 成员外部访问报错
// console.log(person.age); // Error: Property 'age' is protected and only accessible within class 'Person' and its subclasses[^4]const employee = new Employee("Bob", 1002, 35);
employee.showAge(); // 输出: Age: 35(protected 成员在派生类中可访问)
关键点解析:
public 使用:
name
成员和displayInfo
方法可被任何代码访问,适合公开接口。private 使用:
id
成员只能在Person
类内部使用(如displayInfo
方法中),外部或派生类访问会触发编译错误,确保数据封装。protected 使用:
age
成员在Person
和Employee
中可访问,但外部不可访问,适合继承场景。默认行为:如果不写修饰符(如
name
未显式声明),则等同于public
。
3. 总结
访问修饰符是 TypeScript 实现面向对象封装的核心机制,以下是关键总结:
作用域比较(基于引用):
修饰符 当前类 同包子类 其他派生类 外部代码 public √ √ √ √ protected √ √ √ × private √ × × × 默认 √ √ × ×
最佳实践:
使用
private
隐藏内部实现细节,防止意外修改。使用
protected
在继承体系中共享成员,避免外部访问。优先用
public
定义公共 API,保持代码简洁(默认行为)。
编译与运行时:TypeScript 在编译时检查修饰符,但 JavaScript 无原生支持,编译后可能通过闭包模拟私有性(如
WeakMap
)。适用场景:大型项目需要严格封装时(如类库开发),访问修饰符能减少错误并提升代码可维护性。
通过合理使用这些修饰符,开发者可以构建更健壮、可扩展的 TypeScript 应用。