Чем отличается extends от implements в TypeScript?
В TypeScript два ключевых слова, extends
и implements
, часто используются в контексте наследования и реализации типов. Но их предназначение и использование отличаются. Давайте рассмотрим их более подробно.
1. extends
Ключевое слово extends
используется для наследования классов или интерфейсов. Когда один класс или интерфейс extends
другой, он наследует его свойства и методы. Это позволяет создавать более специализированные версии базовых классов или интерфейсов.
Пример использования extends
с классами
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log(`${this.name} издает звук`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} гавкает`);
}
}
const dog = new Dog("Шарик");
dog.speak(); // Шарик гавкает
В этом примере класс Dog
наследует свойства и методы класса Animal
. Метод speak
переопределен в классе Dog
, чтобы издать другой звук.
Пример использования extends
с интерфейсами
interface Animal {
name: string;
speak(): void;
}
interface Pet extends Animal {
owner: string;
}
const myPet: Pet = {
name: "Мурка",
owner: "Иван",
speak: () => console.log("Мяу")
};
console.log(`У меня есть питомец ${myPet.name}, его владелец ${myPet.owner}.`);
myPet.speak(); // Мяу
Здесь интерфейс Pet
наследует от интерфейса Animal
, добавляя дополнительное свойство owner
.
2. implements
Ключевое слово implements
используется на уровне классов для указания, что класс реализует интерфейс. Это значит, что класс должен реализовывать все свойства и методы, описанные в интерфейсе.
Пример использования implements
interface Animal {
name: string;
speak(): void;
}
class Cat implements Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log(`${this.name} мяукает`);
}
}
const cat = new Cat("Барсик");
cat.speak(); // Барсик мяукает
В этом примере класс Cat
реализует интерфейс Animal
, и мы видим, что он предоставляет реализацию для свойств и методов, описанных в интерфейсе.
Сравнение extends
и implements
extends
используется для создания нового класса на основе существующего или для создания нового интерфейса на основе другого интерфейса.implements
используется для обозначения того, что класс должен соответствовать определенному интерфейсу, обеспечивая реализацию всех его свойств и методов.
Таким образом, extends
связан с наследованием, а implements
— с реализацией интерфейсов, что позволяет обеспечить типобезопасность и структурированность в коде TypeScript.