TypeScript - Классы: Пособие для начинающих
Здравствуйте, будущий coding superstar! ? Готовы окунуться в захватывающий мир классов TypeScript? Не волнуйтесь, если вы еще ни разу не писали строку кода – мы начнем с нуля и будем постепенно продвигаться вперед. К концу этого руководства вы будете создавать классы как профи! Так что lets get started на этом приключении вместе.
Что такое классы?
Прежде чем мы углубимся в детали, давайте поймем, что такое классы. Представьте класс как чертеж для создания объектов. Так же, как архитекторы используют чертежи для строительства домов, мы используем классы для создания объектов в нашем коде. Эти объекты могут иметь свойства (например, цвет дома) и методы (например, открывать дверь).
Создание классов
Давайте начнем с создания нашего первого класса. Мы создадим простой класс 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! Какой у тебя make?" или "Эй, myCar! Дай нам гудок!"
Наследование классов
Наследование - это мощная функция, которая позволяет нам создавать новые классы на основе существующих. Давайте создадим класс SportsCar
, который наследуется от нашего класса Car
:
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(`Racing at ${this.topSpeed} mph!`);
}
}
let mySpeedster = new SportsCar("Ferrari", "F8", 2021, 210);
mySpeedster.honk(); // Выводит: Beep beep!
mySpeedster.race(); // Выводит: Racing at 210 mph!
Вот что происходит:
- Мы используем ключевое слово
extends
для наследования отCar
. - Мы добавляем новое свойство
topSpeed
. - В конструкторе мы вызываем
super()
для инициализации свойств родительского класса. - Мы добавляем новый метод
race
, специфичный дляSportsCar
.
Наш SportsCar
имеет все свойства и методы Car
, plus свои собственные дополнения!
Переопределение методов
Иногда мы хотим изменить, как метод из родительского класса работает в нашем дочернем классе. Это называется переопределение метода. Давайте переопределим метод honk
в нашем SportsCar
:
class SportsCar extends Car {
// ... предыдущий код ...
honk() {
console.log("Vroom vroom!");
}
}
mySpeedster.honk(); // Выводит: Vroom vroom!
Теперь, когда мы вызываем honk()
на SportsCar
, он издает более спортивный звук!
Ключевое слово 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("Insufficient funds!");
}
}
protected getBalance() {
return this.balance;
}
}
-
private
: Доступен только внутри класса. -
public
: Доступен из anywhere (по умолчанию, если не указано). -
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. Помните, что практика makes perfect, так что не бойтесь экспериментировать с этими концепциями. Создавайте свои собственные классы, комбинируйте разные функции и, самое главное, получайте удовольствие от программирования! Кто знает, может быть, в следующий раз вы будете тем, кто teaches этот класс! ?
Credits: Image by storyset