Як клас реалізує інтерфейс?
1. Як клас реалізує інтерфейс
Коли клас реалізує інтерфейс, він зобов'язується реалізувати всі властивості й методи, описані в цьому інтерфейсі.
Для цього використовується ключове слово implements.
Приклад 1: проста реалізація інтерфейсу
interface IUser {
name: string;
age: number;
greet(): void;
}
class User implements IUser {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): void {
console.log(`Hello, my name is ${this.name}`);
}
}
const user = new User("Tim", 25);
user.greet(); // Hello, my name is TimТут:
- Інтерфейс
IUserвизначає контракт (що клас повинен матиname,age,greet()). - Клас
Userреалізує цей контракт за допомогоюimplements IUser.
Якщо клас пропустить хоч одну властивість або метод - буде помилка:
class BadUser implements IUser {
name: string = "Alex";
// Помилка: Property 'age' is missing in type 'BadUser'
}2. Що робить ключове слово implements
Ключове слово implements:
- змушує TypeScript перевірити відповідність структури класу інтерфейсу;
- не впливає на runtime - лише на перевірку типів;
- гарантує, що клас реалізує всі обов'язкові поля і методи інтерфейсу.
Важливо: TypeScript використовує структурну типізацію - тобто неважливо, як називається інтерфейс, головне, щоб форма збігалася.
Приклад 2: структурна перевірка
interface Logger {
log(msg: string): void;
}
class ConsoleLogger implements Logger {
log(msg: string) {
console.log(msg);
}
}
// Навіть якщо інтерфейс не пов'язаний явно:
const customLogger: Logger = new ConsoleLogger(); // Ок, структура збігається3. Чи можна реалізувати кілька інтерфейсів?
Так! Клас може реалізовувати кілька інтерфейсів одночасно, вказавши їх через кому:
interface Printable {
print(): void;
}
interface Serializable {
serialize(): string;
}
class Document implements Printable, Serializable {
print() {
console.log("Printing document...");
}
serialize() {
return JSON.stringify({ content: "..." });
}
}TypeScript перевірить, що
Documentреалізує всі методи обох інтерфейсів.
4. Інтерфейси можуть розширювати одне одного
Іноді зручно створювати інтерфейси, які успадковують одне одного:
interface Person {
name: string;
}
interface Employee extends Person {
position: string;
}
class Developer implements Employee {
name: string;
position: string;
constructor(name: string, position: string) {
this.name = name;
this.position = position;
}
}Клас Developer реалізує Employee,
а значить автоматично повинен містити все, що є і в Person, і в Employee.
5. Поєднання з абстрактними класами
Можна використовувати інтерфейси разом з абстрактними класами - інтерфейс задає форму, абстрактний клас - базову реалізацію:
interface Movable {
move(distance: number): void;
}
abstract class Vehicle implements Movable {
abstract move(distance: number): void;
start() {
console.log("Engine started");
}
}
class Car extends Vehicle {
move(distance: number): void {
console.log(`Driving ${distance} km`);
}
}6. Інтерфейси і модифікатори доступу
Інтерфейси описують лише публічний інтерфейс класу. Вони не можуть вимагати private або protected членів:
interface IUser {
name: string;
getName(): string;
}
class User implements IUser {
constructor(public name: string) {}
getName() {
return this.name;
}
private secret() {} // допустимо, але не частина інтерфейсу
}Усе, що описано в інтерфейсі, стає частиною публічного API класу.
7. Інтерфейс для статичних членів класу
Інтерфейси не можуть напряму описувати статичні поля і методи. Але це можна зробити опосередковано, через тип конструктора:
interface IUserConstructor {
new (name: string): IUserInstance;
}
interface IUserInstance {
name: string;
greet(): void;
}
function createUser(Ctor: IUserConstructor) {
return new Ctor("Tim");
}
class User implements IUserInstance {
constructor(public name: string) {}
greet() {
console.log(`Hi, ${this.name}`);
}
}
createUser(User); // OKПідсумок
| Питання | Відповідь |
|---|---|
| Як клас реалізує інтерфейс? | Через ключове слово implements |
Що робить implements? | Перевіряє, що клас відповідає структурі інтерфейсу |
| Чи можна реалізувати кілька інтерфейсів? | Так, через кому |
| Чи можна реалізувати не всі методи? | Ні, компілятор видасть помилку |
| Чи працює в runtime? | Ні, це лише перевірка типів |
Чи можна комбінувати з наслідуванням (extends)? | Так - class A extends B implements C, D |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.