TypeScript 访问修饰符

TypeScript 中 public、private 和 protected 的使用和区别

问题

TypeScript 支持哪些访问修饰符,它们有什么区别?

解答

TypeScript 提供三种访问修饰符来控制类成员的可访问性:publicprivateprotected

public(公共)

类的所有成员、子类以及类的实例都可以访问。

class Animal {
  public name: string;
  
  constructor(name: string) {
    this.name = name;
  }
  
  public move() {
    console.log(`${this.name} is moving`);
  }
}

const dog = new Animal('Dog');
dog.name; // 可访问
dog.move(); // 可访问

protected(受保护)

类及其子类可以访问,但类的实例无法访问。

class Animal {
  protected name: string;
  
  constructor(name: string) {
    this.name = name;
  }
}

class Dog extends Animal {
  bark() {
    console.log(`${this.name} is barking`); // 子类可访问
  }
}

const dog = new Dog('Dog');
dog.name; // 错误:无法访问

private(私有)

只有类本身可以访问,子类和实例都无法访问。

class Animal {
  private age: number;
  
  constructor(age: number) {
    this.age = age;
  }
  
  getAge() {
    return this.age; // 类内部可访问
  }
}

class Dog extends Animal {
  showAge() {
    console.log(this.age); // 错误:子类无法访问
  }
}

const dog = new Animal(5);
dog.age; // 错误:实例无法访问

默认修饰符

如果不指定访问修饰符,默认为 public

class Animal {
  name: string; // 等同于 public name: string
}

关键点

  • public:类、子类、实例都可访问(默认修饰符)
  • protected:类和子类可访问,实例不可访问
  • private:仅类本身可访问,子类和实例都不可访问
  • 未指定修饰符时默认为 public