返回

TypeScript 进阶之路:接口、类、构造函数、继承与重写

前端

接口:定义契约

接口在TypeScript中扮演着至关重要的角色,它定义了一系列方法和属性的契约,而任何想要实现该接口的类都必须遵守这些契约。换句话说,接口为类提供了一个蓝图,指导类如何定义其成员。

interface Person {
    name: string;
    age: number;
    greet(message: string): void;
}

在这个例子中,Person接口定义了三个成员:nameage属性,以及一个名为greet的方法。任何想要实现Person接口的类都必须包含这些成员,并遵守接口所定义的契约。

类:构建对象

类是TypeScript中定义对象的蓝图,它允许您创建具有相同属性和行为的对象集合。类可以从接口继承,也可以从其他类继承。

class Employee implements Person {
    name: string;
    age: number;
    salary: number;

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

    greet(message: string): void {
        console.log(`Hello ${message}, my name is ${this.name} and I'm ${this.age} years old.`);
    }
}

在上面的例子中,Employee类实现了Person接口,并定义了三个属性:nameagesalaryEmployee类还定义了一个构造函数,用于初始化对象的属性。greet方法继承自Person接口,并在类中被重写。

构造函数:初始化对象

构造函数是在创建对象时调用的特殊方法。它用于初始化对象的属性。构造函数的名称必须与类名相同,并且不能有返回值类型。

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

在上面的例子中,Employee类的构造函数接受三个参数:nameagesalary。这些参数被用来初始化对象的属性。

继承:重用代码

继承允许一个类从另一个类继承属性和方法。子类可以访问父类的所有公共和受保护的成员,并且可以重写父类的方法。

class Manager extends Employee {
    bonus: number;

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

    getSalaryWithBonus(): number {
        return this.salary + this.bonus;
    }
}

在上面的例子中,Manager类从Employee类继承。Manager类定义了一个新的属性bonus,并重写了getSalary方法以计算经理的工资和奖金总和。

重写:自定义行为

重写允许子类覆盖父类的方法。这使得子类可以根据自己的需要定制父类的方法。

class Manager extends Employee {
    getSalaryWithBonus(): number {
        return this.salary + this.bonus;
    }
}

在上面的例子中,Manager类重写了Employee类的getSalary方法。Manager类的getSalaryWithBonus方法计算经理的工资和奖金总和,而Employee类的getSalary方法只计算工资。

访问类型:控制访问

访问类型用于控制对类成员的访问。TypeScript支持三种访问类型:公共(public)、受保护(protected)和私有(private)。

  • 公共成员可以在任何地方访问。
  • 受保护成员只能在类本身及其子类中访问。
  • 私有成员只能在类本身中访问。
class Employee {
    private name: string;
    protected age: number;
    public salary: number;

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

    greet(): void {
        console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
    }
}

在上面的例子中,name属性是私有的,只能在Employee类中访问。age属性是受保护的,只能在Employee类及其子类中访问。salary属性是公共的,可以在任何地方访问。

静态属性和方法:共享资源

静态属性和方法与类本身相关联,而不是与类的实例相关联。静态成员可以通过类名直接访问,而无需创建类的实例。

class Employee {
    static companyName: string = "Acme Corporation";

    static getCompanyInfo(): string {
        return `Welcome to ${this.companyName}!`;
    }
}

console.log(Employee.companyName); // "Acme Corporation"
console.log(Employee.getCompanyInfo()); // "Welcome to Acme Corporation!"

在上面的例子中,companyNameEmployee类的静态属性。getCompanyInfoEmployee类的静态方法。静态属性和方法可以通过类名直接访问,而无需创建类的实例。

结论

接口、类、构造函数、继承、重写、访问类型以及静态属性和方法都是TypeScript中构建对象模型的基础概念。通过理解这些概念,您可以编写出更健壮、更易维护的TypeScript程序。