Class
在 TypeScript 中,类(Class)是面向对象编程的核心概念之一,它提供了一种结构化的方式来定义对象的蓝图,包括属性和方法。下面详细介绍 TypeScript 中类的定义、构造函数、属性、方法、继承、访问修饰符等相关内容。
1. 定义类
在 TypeScript 中定义一个类使用 class
关键字,类可以包含属性和方法。
class Person {
// 属性
firstName: string;
lastName: string;
// 构造函数
constructor(firstName: string, lastName: string) {
this.firstName = firstName;
this.lastName = lastName;
}
// 方法
greet() {
return `Hello, ${this.firstName} ${this.lastName}`;
}
}
// 创建对象
let person = new Person('John', 'Doe');
console.log(person.greet()); // 输出: Hello, John Doe
2. 构造函数
类的构造函数使用 constructor
关键字定义,用于初始化对象的实例。在构造函数中,可以初始化类的属性。
class Person {
firstName: string;
lastName: string;
// 构造函数
constructor(firstName: string, lastName: string) {
this.firstName = firstName;
this.lastName = lastName;
}
}
3. 属性和方法
类可以包含实例属性和方法,也可以包含静态属性和方法(通过 static
关键字定义)。
class Person {
// 实例属性
firstName: string;
lastName: string;
// 静态属性
static species = 'Homo sapiens';
// 构造函数
constructor(firstName: string, lastName: string) {
this.firstName = firstName;
this.lastName = lastName;
}
// 实例方法
greet() {
return `Hello, ${this.firstName} ${this.lastName}`;
}
// 静态方法
static introduceSpecies() {
return `We are ${Person.species}`;
}
}
let person = new Person('John', 'Doe');
console.log(person.greet()); // 输出: Hello, John Doe
console.log(Person.introduceSpecies()); // 输出: We are Homo sapiens
4. 继承
类可以通过 extends
关键字进行继承另一个类,子类(派生类)可以继承父类(基类)的属性和方法,并且可以扩展或重写它们。
class Employee extends Person {
position: string;
constructor(firstName: string, lastName: string, position: string) {
super(firstName, lastName); // 调用父类的构造函数
this.position = position;
}
// 重写父类的方法
greet() {
return `Hello, my name is ${this.firstName} ${this.lastName}, and I am a ${this.position}`;
}
}
let employee = new Employee('Alice', 'Smith', 'Developer');
console.log(employee.greet()); // 输出: Hello, my name is Alice Smith, and I am a Developer
5. 访问修饰符
TypeScript 支持访问修饰符来控制类的成员(属性和方法)的访问权限。主要的访问修饰符包括 public
、private
和 protected
。
public
:默认的访问修饰符,成员在类内外都可以访问。private
:成员只能在类内部访问。protected
:成员在类内部和继承的子类中可以访问。
class Person {
private age: number;
constructor(private firstName: string, private lastName: string) {
this.age = 0;
}
greet() {
return `Hello, ${this.firstName} ${this.lastName}`;
}
}
let person = new Person('John', 'Doe');
// console.log(person.age); // 错误: 'age' 是私有的
// console.log(person.firstName); // 错误: 'firstName' 是私有的
console.log(person.greet()); // 输出: Hello, John Doe
6. 抽象类
抽象类用于定义其他类继承的基类,不能被实例化。抽象类的方法在子类中必须被实现(除非它们自己也是抽象的)。
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log('Moving...');
}
}
class Dog extends Animal {
makeSound(): void {
console.log('Woof! Woof!');
}
}
let myDog = new Dog();
myDog.makeSound(); // 输出: Woof! Woof!
myDog.move(); // 输出: Moving...
7. 使用类实现接口
类可以使用 implements
关键字来实现接口,一个类可以实现多个接口。
interface Shape {
calculateArea(): number;
}
class Circle implements Shape {
constructor(private radius: number) {}
calculateArea(): number {
return Math.PI * this.radius * this.radius;
}
}
let circle = new Circle(5);
console.log(circle.calculateArea()); // 输出: 78.53981633974483
总结
在 TypeScript 中,类是面向对象编程的基础,它允许你组织代码以对象为中心,并通过继承和访问修饰符等机制实现代码的组织和封装。理解和熟练使用类是 TypeScript 中的重要一环,能够帮助你编写结构清晰、易于维护的代码。