TypeScript 进阶之路:接口、类、构造函数、继承与重写
2024-01-12 02:34:29
接口:定义契约
接口在TypeScript中扮演着至关重要的角色,它定义了一系列方法和属性的契约,而任何想要实现该接口的类都必须遵守这些契约。换句话说,接口为类提供了一个蓝图,指导类如何定义其成员。
interface Person {
name: string;
age: number;
greet(message: string): void;
}
在这个例子中,Person
接口定义了三个成员:name
和age
属性,以及一个名为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
接口,并定义了三个属性:name
、age
和salary
。Employee
类还定义了一个构造函数,用于初始化对象的属性。greet
方法继承自Person
接口,并在类中被重写。
构造函数:初始化对象
构造函数是在创建对象时调用的特殊方法。它用于初始化对象的属性。构造函数的名称必须与类名相同,并且不能有返回值类型。
constructor(name: string, age: number, salary: number) {
this.name = name;
this.age = age;
this.salary = salary;
}
在上面的例子中,Employee
类的构造函数接受三个参数:name
、age
和salary
。这些参数被用来初始化对象的属性。
继承:重用代码
继承允许一个类从另一个类继承属性和方法。子类可以访问父类的所有公共和受保护的成员,并且可以重写父类的方法。
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!"
在上面的例子中,companyName
是Employee
类的静态属性。getCompanyInfo
是Employee
类的静态方法。静态属性和方法可以通过类名直接访问,而无需创建类的实例。
结论
接口、类、构造函数、继承、重写、访问类型以及静态属性和方法都是TypeScript中构建对象模型的基础概念。通过理解这些概念,您可以编写出更健壮、更易维护的TypeScript程序。