TypeScript 访问修饰符

访问修饰符用来控制类成员(属性、方法)的可见范围。TypeScript 提供 publicprotectedprivate 三种访问级别,再配合 readonly,就能把类的内部状态封装起来,只对外暴露必要的接口,防止状态被随意破坏。

public:默认公开

public 成员在任何位置都能访问;不写修饰符时默认就是 public:

class Person {
  public name: string; // public 可省略不写
  constructor(name: string) {
    this.name = name;
  }
  public sayHi(): void {
    console.log("你好," + this.name);
  }
}

const p = new Person("小明");
p.sayHi();           // 输出:你好,小明
console.log(p.name); // 外部可以直接读取属性

private:仅类内可见

private 成员只能在声明它的类内部访问,实例外部与子类都不能触碰:

class BankAccount {
  private balance: number = 1000;
  deposit(amount: number): void {
    this.balance += amount; // 类内部可以读写
  }
  getBalance(): number {
    return this.balance;
  }
}

const acc = new BankAccount();
acc.deposit(500);
console.log(acc.getBalance()); // 输出:1500
// acc.balance; // 报错:属性 balance 为私有属性

余额对外只读不可写,必须经过受控方法修改,这就是封装的意义。

protected:类内与子类可见

protected 成员在类内以及子类内部可访问,实例外部不行:

class Employee {
  protected salary: number = 8000;
}
class Manager extends Employee {
  show(): void {
    console.log("管理者薪资:" + this.salary); // 子类内可读
  }
}

new Manager().show(); // 输出:管理者薪资:8000
// new Manager().salary; // 报错:属性 salary 受保护

适合把「仅继承体系内部关心的数据」开放给子类使用。

readonly 与参数属性

readonly 表示只读,只能在声明处或构造函数内赋值;把修饰符直接写在构造参数上,会自动生成同名属性并赋值,这种写法叫参数属性

class Config {
  constructor(
    public readonly name: string, // 公开只读属性
    private version: number        // 私有属性
  ) {}
  show(): void {
    console.log(this.name + " v" + this.version);
  }
}

const cfg = new Config("app", 2);
cfg.show(); // 输出:app v2
// cfg.name = "web"; // 报错:属性 name 为只读

一个参数同时完成「声明字段、标注修饰、接收赋值」三件事,代码简洁很多。

小结:public 默认开放给所有人,private 锁在类内部,protected 开放给继承体系;再加 readonly 只读与参数属性简写,类的状态就能被控制得恰到好处。

笔记加载中…