TypeScript - 访问修饰符



访问修饰符的概念用于在 TypeScript 中实现封装或数据隐藏。访问修饰符定义了在定义类之外类成员的可见性。类成员包括属性和函数。访问修饰符也称为访问说明符。

TypeScript 支持三种类型的访问修饰符——publicprivateprotected。这些修饰符是用于将类成员声明为公共、私有或受保护的关键字。

公共类成员可以在代码的任何地方访问。私有成员只能在定义它的类中访问。受保护的成员可以在类和派生类中访问。

让我们详细了解上面讨论的三种访问修饰符。

公共访问修饰符

TypeScript 中的公共访问修饰符定义了一个公共类成员。默认情况下,类的成员是公共的。因此,使用 public 关键字声明成员为公共成员是可选的。公共成员可以在定义成员的类内和类外任何地方访问。

示例

在下面的示例中,我们创建了一个名为 Person 的类。Person 类有两个成员,一个是公共属性 name,另一个是公共方法 greet()。由于这些成员被声明为公共的,因此可以在程序的任何地方访问它们。

我们还创建了 Person 类的实例 person。我们访问 person 对象的 name 属性并为其赋值。最后,我们调用 greet 函数以显示带有新名称的问候语。

class Person {
   public name: string = "";
   public greet(): void {
      console.log(`Hello, my name is ${this.name}!`);
   }
} 
const person = new Person(); 
person.name = "John"; 
person.greet();

编译后,它将生成以下 JavaScript 代码。

class Person {
    constructor() {
        this.name = "";
    }
    greet() {
        console.log(`Hello, my name is ${this.name}!`);
    }
}
const person = new Person();
person.name = "John";
person.greet();

以上示例代码的输出如下:

Hello, my name is John!

私有访问修饰符

私有访问修饰符限制了类成员(属性或方法)对其声明所在的类的访问。当您向属性或方法添加 private 修饰符时,您只能在同一个类中访问该属性或方法。

TypeScript 中的私有访问修饰符定义了一个私有类成员。私有成员可以在定义它们的类中访问。

示例

在这个例子中,我们创建了一个 BankAccount 类,它有一个私有属性 balance,只能在类内访问和修改。此外,我们还有一个私有方法 calculateInterest(),它根据余额计算利息。

您可以从输出中观察到,尝试访问私有成员将导致 TypeError。

class BankAccount {
   private balance: number; 
   constructor(initialBalance: number) {
      this.balance = initialBalance;
   } 
   private calculateInterest(): number {
      const interestRate = 0.05;
      return this.balance * interestRate;
   } 
}  
// Creating an instance of the BankAccount class
const account = new BankAccount(1000); 

// Attempting to access private members
console.log(account.balance); 
console.log(account.calculateInterest());

编译后,它将生成以下 JavaScript 代码。

class BankAccount {
    constructor(initialBalance) {
        this.balance = initialBalance;
    }
    calculateInterest() {
        const interestRate = 0.05;
        return this.balance * interestRate;
    }
}
// Creating an instance of the BankAccount class
const account = new BankAccount(1000);
// Attempting to access private members
console.log(account.balance);
console.log(account.calculateInterest());

并将给出以下错误:

Property 'balance' is private and only accessible within class 'BankAccount'.
Property 'calculateInterest' is private and only accessible within class 'BankAccount'.

以上示例代码的输出如下:

1000
50

受保护的访问修饰符

受保护的访问修饰符用于定义受保护的类成员(属性或方法)。受保护的数据成员只能在定义它的类或任何扩展它的类中访问。

示例

在这个例子中,我们创建了一个基类 Animal,它有一个受保护的属性 name,可以在类及其派生类中访问和修改。我们还有一个受保护的方法 makeSound(),它只是记录一条消息。

然后,我们创建一个派生类 Dog,它扩展了 Animal 类。Dog 类添加了一个公共方法 bark(),它利用从基类继承的 name 属性输出一条 bark 消息。

最后,我们创建了一个名为 dog 的 Dog 类实例,其名称为“Buddy”,并调用 bark() 方法。

输出将显示狗的名字,然后是 bark 消息。

class Animal {
   protected name: string; 
   constructor(name: string) {
      this.name = name;
   } 
   protected makeSound(): void {
      console.log("The animal makes a sound");
   }
} 
class Dog extends Animal {
   public bark(): void {
      console.log(`${this.name} barks!`);
   }
} 
// Creating an instance of the Dog class
const dog = new Dog("Buddy"); 
dog.bark();

编译后,它将生成以下 JavaScript 代码。

class Animal {
    constructor(name) {
        this.name = name;
    }
    makeSound() {
        console.log("The animal makes a sound");
    }
}
class Dog extends Animal {
    bark() {
        console.log(`${this.name} barks!`);
    }
}
// Creating an instance of the Dog class
const dog = new Dog("Buddy");
dog.bark();

以上示例代码的输出如下:

Buddy barks!
广告