TypeScript作为JavaScript的超集,为JavaScript带来了强大的面向对象编程能力。其中,访问修饰符是TypeScript面向对象特性的重要组成部分,它允许开发者精确控制类成员的可见性和可访问性。本文将深入探讨TypeScript中的三种主要访问修饰符:public、private和protected。
访问修饰符概述
访问修饰符是面向对象编程中封装特性的关键实现方式,它定义了类成员(属性和方法)的可访问范围:
typescript
class Person {
public name: string; // 公共成员
private age: number; // 私有成员
protected id: string; // 受保护成员
}
public修饰符
public是默认的访问级别,当不显式指定修饰符时,成员默认为public。
typescript
class Animal {
public name: string;
constructor(name: string) {
this.name = name;
}
}
const dog = new Animal('Buddy');
console.log(dog.name); // 可以访问
特点:
- 可以在类的内部、外部和子类中访问
- 是默认的访问级别,可以省略不写
- 提供了最宽松的访问控制
private修饰符
private成员只能在声明它们的类内部访问。
typescript
class BankAccount {
private balance: number;
constructor(initialBalance: number) {
this.balance = initialBalance;
}
public getBalance(): number {
return this.balance; // 类内部可以访问
}
}
const account = new BankAccount(1000);
console.log(account.getBalance()); // 正确
// console.log(account.balance); // 错误:外部不能访问
特点:
- 只能在定义它们的类内部访问
- 子类和其他外部代码都无法访问
- 提供了最严格的封装
- 在运行时(编译为JavaScript后)实际上仍然可访问,这是TypeScript的类型检查特性
protected修饰符
protected成员可以在类内部和子类中访问,但不能从类的外部访问。
typescript
class Vehicle {
protected speed: number = 0;
protected accelerate(): void {
this.speed += 10;
}
}
class Car extends Vehicle {
public drive(): void {
this.accelerate(); // 子类可以访问protected方法
console.log(`Driving at ${this.speed} km/h`); // 子类可以访问protected属性
}
}
const car = new Car();
car.drive();
// car.speed = 100; // 错误:外部不能访问
特点:
- 介于public和private之间的访问级别
- 允许子类继承和访问,但不向外部公开
- 常用于构建类层次结构中的共享实现细节
访问修饰符的最佳实践
- 最小权限原则:默认使用private,只在必要时提升访问级别
- API设计:public成员构成类的公共API,应保持稳定
- 封装性:使用private和protected隐藏实现细节
- 继承设计:protected成员用于设计可扩展的类层次结构
对比JavaScript的私有字段
TypeScript的private是编译时检查,而ES2019+引入了真正的私有字段语法:
typescript
class Example {
#realPrivateField: string; // 真正的私有字段
constructor() {
this.#realPrivateField = "secret";
}
}
总结
TypeScript的访问修饰符为面向对象编程提供了强大的封装能力:
- public:默认级别,无访问限制
- private:严格的类内部访问控制
- protected:允许子类继承的受保护访问
合理使用这些修饰符可以创建出结构良好、易于维护且安全的类设计,是TypeScript面向对象编程中不可或缺的工具。