TypeScript - 类:初学者的指南

你好啊,未来的编程超级巨星!? 你准备好跃入TypeScript类的精彩世界了吗?如果你之前从未写过一行代码,也不用担心——我们将从零开始,逐步构建知识体系。在本教程结束时,你将能够像专业人士一样创建类!那么,让我们一起开始这段冒险之旅吧。

TypeScript - Classes

类是什么?

在我们深入了解之前,先来了解一下类是什么。可以把类想象成创建对象的蓝图。就像建筑师使用蓝图来建造房子一样,我们使用类在代码中创建对象。这些对象可以拥有属性(比如房子的颜色)和方法(比如开门)。

创建类

让我们开始创建我们的第一个类。我们将创建一个简单的Car类。

class Car {
make: string;
model: string;
year: number;

constructor(make: string, model: string, year: number) {
this.make = make;
this.model = model;
this.year = year;
}

honk() {
console.log("Beep beep!");
}
}

让我们分解一下:

  1. 我们以class关键字开始,后面跟着类的名称Car
  2. 在类内部,我们定义了属性:makemodelyear
  3. constructor是一个特殊的方法,当创建一个新的Car对象时会被调用。它为我们的属性设置初始值。
  4. 我们还有一个honk方法,当被调用时,会在控制台打印出"Beep beep!"。

创建实例对象

现在我们有了Car类,让我们创建一些实际的车对象!

let myCar = new Car("Toyota", "Corolla", 2020);
let yourCar = new Car("Honda", "Civic", 2019);

这里,我们创建了两个Car对象:myCaryourCarnew关键字告诉TypeScript创建我们Car类的新实例。

访问属性和函数

现在我们有了车对象,该如何使用它们呢?让我们看看:

console.log(myCar.make);  // 输出:Toyota
console.log(yourCar.year);  // 输出:2019

myCar.honk();  // 输出:Beep beep!

我们使用点符号来访问对象的属性和方法。就像说,“嘿,myCar!你的制造商是谁?”或者“嘿,myCar!给我们鸣个喇叭!”

类继承

继承是一个强大的特性,它允许我们基于现有的类创建新的类。让我们创建一个从我们的Car类继承的SportsCar类:

class SportsCar extends Car {
topSpeed: number;

constructor(make: string, model: string, year: number, topSpeed: number) {
super(make, model, year);
this.topSpeed = topSpeed;
}

race() {
console.log(`以 ${this.topSpeed} 英里每小时的速度赛车!`);
}
}

let mySpeedster = new SportsCar("Ferrari", "F8", 2021, 210);
mySpeedster.honk();  // 输出:Beep beep!
mySpeedster.race();  // 输出:以 210 英里每小时的速度赛车!

这里发生了什么:

  1. 我们使用extends关键字从Car继承。
  2. 我们添加了一个新的属性topSpeed
  3. 在构造函数中,我们调用super()来初始化父类的属性。
  4. 我们添加了一个特定于SportsCar的新race方法。

我们的SportsCar拥有Car的所有属性和方法,加上它自己的新增内容!

方法重写

有时,我们想要改变父类中的方法在子类中的工作方式。这称为方法重写。让我们在SportsCar中重写honk方法:

class SportsCar extends Car {
// ...之前的代码...

honk() {
console.log("Vroom vroom!");
}
}

mySpeedster.honk();  // 输出:Vroom vroom!

现在当我们对一个SportsCar调用honk()时,它会发出更动感的声音!

static关键字

static关键字允许我们创建属于类本身而不是类的实例的属性和方法。让我们在Car类中添加一个静态方法:

class Car {
// ...之前的代码...

static numberOfWheels() {
return 4;
}
}

console.log(Car.numberOfWheels());  // 输出:4

我们可以直接在Car类上调用这个方法,而不需要创建实例。

instanceof运算符

instanceof运算符允许我们检查一个对象是否是特定类的实例:

console.log(myCar instanceof Car);  // 输出:true
console.log(mySpeedster instanceof SportsCar);  // 输出:true
console.log(mySpeedster instanceof Car);  // 输出:true
console.log(myCar instanceof SportsCar);  // 输出:false

当需要检查你正在处理的对象类型时,这非常有用。

数据隐藏

在TypeScript中,我们可以使用访问修饰符来控制类成员的可见性。有三个访问修饰符:publicprivateprotected

class BankAccount {
private balance: number;

constructor(initialBalance: number) {
this.balance = initialBalance;
}

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

public withdraw(amount: number) {
if (amount <= this.balance) {
this.balance -= amount;
} else {
console.log("资金不足!");
}
}

protected getBalance() {
return this.balance;
}
}
  • private:仅在类内部可访问。
  • public:从任何地方都可以访问(如果未指定,则为默认)。
  • protected:在类内部及其子类中可访问。

类和接口

TypeScript中的接口允许我们为我们的类定义一个契约。让我们为我们的Car类创建一个接口:

interface Vehicle {
make: string;
model: string;
year: number;
honk(): void;
}

class Car implements Vehicle {
// ...实现...
}

通过实现一个接口,我们确保我们的类遵循特定的结构。

方法总结

这里是我们在这篇教程中涵盖的方法总结:

方法 描述
constructor() 初始化类的新实例
honk() 让车发出喇叭声
race() 模拟赛车(对于SportsCar
static numberOfWheels() 返回车的轮子数(对于Car类)
deposit() 向银行账户中存钱
withdraw() 从银行账户中取钱
getBalance() 返回银行账户的当前余额

就这样!你已经迈出了进入TypeScript类世界的第一步。记住,熟能生巧,所以不要害怕实验这些概念。创建你自己的类,混合搭配不同的特性,最重要的是,享受编码的乐趣!谁知道呢,也许下一次你就是教这个课程的人呢!?

Credits: Image by storyset