Z
ZHANK
接口与类

类与访问修饰符

学习 public/private/protected、readonly、抽象类

类与访问修饰符

TypeScript 为 ES6 类添加了类型注解和访问控制。

学完本章你将: 掌握 public/private/protected、readonly、抽象类。


类基础

typescript
class Person {
    name: string;
    age: number;

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

    greet(): string {
        return `Hello, I'm ${this.name}`;
    }
}

const alice = new Person("Alice", 25);
console.log(alice.greet());

访问修饰符

typescript
class BankAccount {
    public readonly id: string;      // 公开 + 只读
    private balance: number;         // 仅此类可访问
    protected owner: string;         // 此类 + 子类可访问

    constructor(id: string, owner: string, balance: number) {
        this.id = id;
        this.owner = owner;
        this.balance = balance;
    }

    public deposit(amount: number): void {
        this.balance += amount;
    }

    private logTransaction(type: string): void {
        console.log(`${type}: ${this.balance}`);
    }
}

const account = new BankAccount("001", "Alice", 1000);
account.deposit(500);
// account.balance;    // ❌ 私有属性
// account.owner;      // ❌ 受保护属性

参数属性(简写)

typescript
// 构造函数参数前加修饰符,自动声明并赋值
class User {
    constructor(
        public name: string,
        private email: string,
        protected role: string = "user",
    ) {}
}

const user = new User("Alice", "a@test.com");
console.log(user.name); // "Alice" ✅
// user.email; // ❌

抽象类

typescript
abstract class Animal {
    abstract makeSound(): string; // 子类必须实现

    move(): string {
        return "Moving...";
    }
}

class Dog extends Animal {
    makeSound(): string {
        return "汪汪!";
    }
}

class Cat extends Animal {
    makeSound(): string {
        return "喵喵!";
    }
}

// const animal = new Animal(); // ❌ 不能实例化抽象类
const dog: Animal = new Dog();   // ✅ 可以用抽象类型
console.log(dog.makeSound());    // "汪汪!"