访问修饰符 (Access Modifiers)
访问修饰符是 TypeScript 中用于控制类成员(属性和方法)的可见性和访问级别的关键字。通过使用访问修饰符,你可以确保代码的安全性和封装性,防止外部代码不恰当地访问或修改类的内部状态。
TypeScript 提供了三种主要的访问修饰符:
public:默认的访问级别,允许在任何地方访问。private:仅允许在定义它的类内部访问。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 Alice2. 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 Alice3. 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 Developer4. 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. 组合使用
你还可以将 readonly 与 public、private 或 protected 组合使用,以实现更细粒度的访问控制。
示例:
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 中非常重要的特性,它们帮助你控制类成员的可见性和访问级别,从而确保代码的安全性和封装性。合理使用访问修饰符可以使你的代码更加健壮和易于维护。