在 TypeScript 中,访问修饰符(Access Modifiers)用于控制类成员的可见性和访问权限,增强代码的封装性和安全性。主要修饰符包括 publicprivateprotected,它们定义了成员在不同作用域的可访问性。

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 成员在 PersonEmployee 中可访问,但外部不可访问,适合继承场景。

  • 默认行为:如果不写修饰符(如 name 未显式声明),则等同于 public

3. 总结

访问修饰符是 TypeScript 实现面向对象封装的核心机制,以下是关键总结:

  • 作用域比较(基于引用):

    修饰符 当前类 同包子类 其他派生类 外部代码
    public
    protected ×
    private × × ×
    默认 × ×
  • 最佳实践

    • 使用 private 隐藏内部实现细节,防止意外修改。

    • 使用 protected 在继承体系中共享成员,避免外部访问。

    • 优先用 public 定义公共 API,保持代码简洁(默认行为)。

  • 编译与运行时:TypeScript 在编译时检查修饰符,但 JavaScript 无原生支持,编译后可能通过闭包模拟私有性(如 WeakMap)。

  • 适用场景:大型项目需要严格封装时(如类库开发),访问修饰符能减少错误并提升代码可维护性。

通过合理使用这些修饰符,开发者可以构建更健壮、可扩展的 TypeScript 应用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐