Skip to content

访问修饰符 (Access Modifiers)

访问修饰符是 TypeScript 中用于控制类成员(属性和方法)的可见性和访问级别的关键字。通过使用访问修饰符,你可以确保代码的安全性和封装性,防止外部代码不恰当地访问或修改类的内部状态。

TypeScript 提供了三种主要的访问修饰符:

  1. public:默认的访问级别,允许在任何地方访问。
  2. private:仅允许在定义它的类内部访问。
  3. protected:允许在定义它的类及其子类中访问。

此外,TypeScript 还支持 readonly 修饰符,它可以与上述访问修饰符结合使用,以确保属性只能被赋值一次。

1. public

  • 描述public 是默认的访问级别,表示类成员可以在任何地方访问。
  • 使用场景:当你希望类的属性或方法可以被自由访问时使用。

示例:

typescript
class Person {
  public name: string;

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

  public greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}
/**
 * 简写方式
 */
class Person {
  constructor(public name: string) {
    this.name = name;
  }
}

const person = new Person("Alice");
console.log(person.name); // 输出: Alice
person.greet(); // 输出: Hello, my name is Alice

2. private

  • 描述private 修饰符限制类成员只能在定义它的类内部访问。
  • 使用场景:当你希望保护类的内部实现细节,防止外部代码直接访问或修改时使用。

示例:

typescript
class Person {
  private name: string;

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

  private sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }

  public greet() {
    this.sayHello();
  }
}

const person = new Person("Alice");
// console.log(person.name); // Error: 'name' is private and only accessible within class 'Person'.
// person.sayHello(); // Error: 'sayHello' is private and only accessible within class 'Person'.
person.greet(); // 输出: Hello, my name is Alice

3. protected

  • 描述protected 修饰符允许类成员在定义它的类及其子类中访问。
  • 使用场景:当你希望类的某些成员可以在子类中访问,但不允许外部代码直接访问时使用。

示例:

typescript
class Person {
  protected name: string;

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

  protected sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

class Employee extends Person {
  constructor(name: string, public position: string) {
    super(name);
  }

  public introduce() {
    this.sayHello();
    console.log(`I work as a ${this.position}`);
  }
}

const employee = new Employee("Alice", "Developer");
// console.log(employee.name); // Error: 'name' is protected and only accessible within class 'Person' and its subclasses.
employee.introduce(); // 输出: Hello, my name is Alice I work as a Developer

4. readonly

  • 描述readonly 修饰符确保属性只能在构造函数中赋值一次,之后不能被修改。
  • 使用场景:当你希望某个属性在初始化后保持不变时使用。

示例:

typescript
class Person {
  readonly name: string;

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

const person = new Person("Alice");
// person.name = "Bob"; // Error: Cannot assign to 'name' because it is a read-only property.

5. 组合使用

你还可以将 readonlypublicprivateprotected 组合使用,以实现更细粒度的访问控制。

示例:

typescript
class Person {
  public readonly name: string;
  private age: number;

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

const person = new Person("Alice", 30);
console.log(person.name); // 输出: Alice
// person.name = "Bob"; // Error: Cannot assign to 'name' because it is a read-only property.
// console.log(person.age); // Error: 'age' is private and only accessible within class 'Person'.

6. 总结

访问修饰符是 TypeScript 中非常重要的特性,它们帮助你控制类成员的可见性和访问级别,从而确保代码的安全性和封装性。合理使用访问修饰符可以使你的代码更加健壮和易于维护。

Released under the MIT License.