TypeScript 访问修饰符

注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。


TypeScript 中的访问修饰符用于控制类成员(属性和方法)的可见性和可访问性,有助于强制封装。例如,

class Person {
  private age: number;
  
  public greet() {
    // code
  }
}

在此,`Person` 类的 `age` 变量使用 `private` 关键字隐藏,而 `greet()` 函数则使用 `public` 关键字使其可访问。


访问修饰符的类型

在 TypeScript 中,有 3 种访问修饰符

  • Public
  • Private
  • Protected

Public 访问修饰符

`public` 修饰符允许类成员在程序中的任何地方访问——在类内部、外部,甚至是从另一个文件中。例如,

class Person {
  public name: string;

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

  public greet(): void {
    console.log(`Hello, my name is ${this.name}`);
  }
}

const person = new Person("Alex");
console.log(person.name);  
person.greet();   

输出

Alex
Hello, my name is Alex

这里,

  • `name` 从类外部直接访问并打印。
  • `greet()` 也从外部访问并成功运行。

注意:`public` 是 TypeScript 中的默认访问级别。如果未使用任何修饰符,则成员默认被视为 `public`。


Private 访问修饰符

`private` 修饰符在 TypeScript 中限制对类成员的访问,使其只能在声明它的类内部使用。例如,

class Person {
  private age: number;

  constructor(age: number) {
    this.age = age;
  }

  printAge(): void {
    console.log(`Age is ${this.age}`); 
  }
}

const person = new Person(25);
person.printAge();

输出

Age is 25

这里,`age` 使用 `printAge()` 方法打印,因为它是在同一类内部访问的,这是允许的。

但是,如果我们尝试像这样直接从类外部访问 `age`:

console.log(person.age)

它将导致编译时错误,因为 `age` 被标记为 `private`,不能从类外部访问。


Protected 访问修饰符

`protected` 修饰符在 TypeScript 中允许类成员在类本身及其子类中访问,但在类层级结构外部无法访问。例如,

class Person {
  protected gender: string;

  constructor(gender: string) {
    this.gender = gender;
  }
}

class Student extends Person {
  showGender(): void {
    console.log(`Gender is ${this.gender}`);
  }
}

const student = new Student("Female");
student.showGender();

输出

Gender is Female

这里,`gender` 属性被标记为 `protected`,因此不能直接从类外部访问。

但在 `Student` 子类内部却可以工作,因为 `protected` 允许在子类中访问。


总结

  • `public` 成员可以在程序中的任何地方访问。
  • `private` 成员仅在其定义的类内部可访问。
  • `protected` 成员类似于 `private`,但可以在派生(子)类中访问。
说明符 同一类 派生类 类外部
public
private
protected

阅读更多

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战