TypeScript - 类:初学者的指南
你好啊,未来的编程超级巨星!? 你准备好跃入TypeScript类的精彩世界了吗?如果你之前从未写过一行代码,也不用担心——我们将从零开始,逐步构建知识体系。在本教程结束时,你将能够像专业人士一样创建类!那么,让我们一起开始这段冒险之旅吧。
类是什么?
在我们深入了解之前,先来了解一下类是什么。可以把类想象成创建对象的蓝图。就像建筑师使用蓝图来建造房子一样,我们使用类在代码中创建对象。这些对象可以拥有属性(比如房子的颜色)和方法(比如开门)。
创建类
让我们开始创建我们的第一个类。我们将创建一个简单的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!");
}
}
让我们分解一下:
- 我们以
class
关键字开始,后面跟着类的名称Car
。 - 在类内部,我们定义了属性:
make
、model
和year
。 -
constructor
是一个特殊的方法,当创建一个新的Car
对象时会被调用。它为我们的属性设置初始值。 - 我们还有一个
honk
方法,当被调用时,会在控制台打印出"Beep beep!"。
创建实例对象
现在我们有了Car
类,让我们创建一些实际的车对象!
let myCar = new Car("Toyota", "Corolla", 2020);
let yourCar = new Car("Honda", "Civic", 2019);
这里,我们创建了两个Car
对象:myCar
和yourCar
。new
关键字告诉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 英里每小时的速度赛车!
这里发生了什么:
- 我们使用
extends
关键字从Car
继承。 - 我们添加了一个新的属性
topSpeed
。 - 在构造函数中,我们调用
super()
来初始化父类的属性。 - 我们添加了一个特定于
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中,我们可以使用访问修饰符来控制类成员的可见性。有三个访问修饰符:public
、private
和protected
:
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