Множинне наслідування
1. Коротка відповідь
Так, можна! Для цього використовується ключове слово
extends, після якого перелічуються кілька інтерфейсів через кому.
Приклад
interface A {
a: string;
}
interface B {
b: number;
}
interface C extends A, B {
c: boolean;
}
const obj: C = {
a: "Hello",
b: 42,
c: true,
};Інтерфейс
Cтепер включає властивості з усіх трьох інтерфейсів:a,bіc.
2. Як це працює
- TypeScript об'єднує всі властивості з інтерфейсів
AіB. - Якщо успадковані поля не конфліктують - все добре.
- Якщо та сама властивість оголошена в кількох інтерфейсах, TypeScript перевіряє, чи сумісні їхні типи.
Приклад сумісних властивостей
interface X {
value: string;
}
interface Y {
value: string;
}
interface Z extends X, Y {
flag: boolean;
}
const z: Z = { value: "ok", flag: true }; // типи збігаютьсяПриклад конфліктних властивостей
interface X {
value: string;
}
interface Y {
value: number;
}
interface Z extends X, Y {} // Помилка: типи несумісніTypeScript не може об'єднати
stringіnumberв одну властивість з однаковим ім'ям.
3. Наслідування можна поєднувати з власними полями
Ти можеш розширювати кілька інтерфейсів і додавати нові властивості:
interface Position {
x: number;
y: number;
}
interface Shape {
color: string;
}
interface Circle extends Position, Shape {
radius: number;
}
const c: Circle = {
x: 0,
y: 0,
color: "red",
radius: 10,
};
Circleоб'єднує все: координати, колір і радіус.
4. Наслідування інтерфейсів з методами
interface CanFly {
fly(): void;
}
interface CanSwim {
swim(): void;
}
interface Duck extends CanFly, CanSwim {
quack(): void;
}
const duck: Duck = {
fly: () => console.log("Летить"),
swim: () => console.log("Пливе"),
quack: () => console.log("Кря!"),
};Об'єкт
duckзобов'язаний реалізувати всі методи зCanFly,CanSwimіDuck.
5. Можна комбінувати інтерфейси і type
Якщо у тебе є type, інтерфейс не може напряму наслідувати його,
але можна використати перетин типів (&):
type Timestamped = { createdAt: Date };
interface Entity {
id: number;
}
interface User extends Entity, Timestamped { // не можна напряму
name: string;
}
// альтернатива через &:
type UserFull = Entity & Timestamped & { name: string };
interface- лише інтерфейси черезextends. Якщо потрібно об'єднатиtypeтаinterface, використовуй&.
6. Приклад із реального проєкту
interface Identifiable {
id: number;
}
interface Timestamped {
createdAt: Date;
updatedAt: Date;
}
interface User extends Identifiable, Timestamped {
name: string;
email: string;
}
const u: User = {
id: 1,
createdAt: new Date(),
updatedAt: new Date(),
name: "Tim",
email: "tim@example.com",
};Один інтерфейс (
User) об'єднує дані ідентифікації та часові мітки.
Підсумок
В TypeScript інтерфейс може наслідувати кілька інших інтерфейсів:
javascriptinterface C extends A, B, D { ... }Це дозволяє:
- об'єднувати структури без дублювання коду;
- створювати "ієрархію контрактів";
- розширювати інтерфейси з методами, властивостями та опціями;
- робити композицію поведінки (наприклад,
CanFly,CanSwim,CanRun).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.