Перейти до основного вмісту
Модуль 2 · Урок 1 із 23/14 у курсі~12 min
Модульні уроки (1/2)

Псевдоніми типів проти інтерфейсів

У TypeScript ми можемо визначити структуру складних об’єктів двома основними способами: за допомогою Інтерфейсів (interface) або Псевдонімів типів (type). Обидва служать для опису "форми" об'єкта або структури даних, але вони мають кілька фундаментальних відмінностей.


Інтерфейси (interface)

Інтерфейс визначає контракт для структури об’єкта. Це стандартний інструмент для опису форм об’єктів і публічних API розширюваним способом.

TS
interface Book {
  title: string;
  pages: number;
  author?: string; // Optional property (can be omitted)
}

const myBook: Book = {
  title: 'The Lord of the Rings',
  pages: 1200,
};

Знак питання (?) позначає властивість як необов’язкову. Об’єкт myBook дійсний, навіть якщо в ньому відсутні властивості author.


Псевдоніми типів (type)

Псевдонім типу дозволяє асоціювати нове ім’я з будь-яким існуючим типом, включаючи примітивні типи, об’єднання, кортежі або цілі структури об’єктів.

TS
type Point = {
  x: number;
  y: number;
};

const coordinates: Point = { x: 10, y: 20 };

Основні відмінності: злиття розширення та оголошення

Хоча interface та type взаємозамінні для більшості звичайних випадків використання, вони демонструють дві критичні відмінності:

1. Розширюваність (успадкування)

Інтерфейси розширено за допомогою ключового слова extends:

TS
interface User {
  username: string;
}

interface Admin extends User {
  privileges: string[];
}

Псевдоніми типів не можна розширити за допомогою extends, але їх можна поєднати за допомогою оператора перетину (&):

TS
type User = {
  username: string;
};

type Admin = User & {
  privileges: string[];
};

2. Об'єднання декларацій

Кілька інтерфейсів з однаковою назвою в одній області автоматично об’єднуються компілятором:

TS
interface User {
  name: string;
}
interface User {
  email: string;
}
// Now User has both 'name' and 'email'!

Ця поведінка не підтримується псевдонімами типів: оголошення того самого type двічі викличе помилку під час компіляції.


Спробуйте самі

Вправа 1: Інтерфейс користувача

вправи#ts.m2.l1.e1
Спроби: 0Завантаження…

Визначте інтерфейс під назвою User, який описує об’єкт користувача. Інтерфейс має містити: id у вигляді числа, ім’я користувача у вигляді рядка та електронну адресу як необов’язковий рядок.

Завантаження редактора…
Показати підказку

Використовуйте рядок синтаксису email?:, щоб позначити його як необов’язковий.

Рішення доступне після 3 спроб

Вправа 2: Псевдонім типу Point2D

вправи#ts.m2.l1.e2
Спроби: 0Завантаження…

Створіть псевдонім типу Point2D, що представляє двовимірну точку з координатами x і y (обидва числа).

Завантаження редактора…
Показати підказку

Використовуйте тип синтаксису Point2D = { x: число; y: число; };

Рішення доступне після 3 спроб

Вправа 3: Розширення інтерфейсів

вправи#ts.m2.l1.e3
Спроби: 0Завантаження…

Визначте інтерфейс під назвою Product з ідентифікатором (номером) і ціною (номером). Потім визначте інтерфейс під назвою DiscountedProduct, який розширює Product і додає додаткову властивість під назвою discountCode (рядок).

Завантаження редактора…
Показати підказку

Використовуйте extends Product, щоб успадкувати поля, і додайте рядок discountCode?:.

Рішення доступне після 3 спроб

Вправа 4: Конфігурація сервера

вправи#ts.m2.l1.e4
Спроби: 0Завантаження…

Визначте псевдонім типу ServerConfig, що представляє об’єкт конфігурації для сервера. Він має містити: хост (рядок), порт (номер) і useHttps як необов’язкове логічне поле.

Завантаження редактора…
Показати підказку

Використовуйте тип синтаксису ServerConfig = { хост: рядок; порт: номер; useHttps?: логічний; }.

Рішення доступне після 3 спроб