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 应用。
更多推荐


所有评论(0)