TypeScript 访问修饰符
访问修饰符用来控制类成员(属性、方法)的可见范围。TypeScript 提供 public、protected、private 三种访问级别,再配合 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 只读与参数属性简写,类的状态就能被控制得恰到好处。