Перейти к основному содержимому
Модуль 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, который описывает объект пользователя. Интерфейс должен содержать: идентификатор в виде числа, имя пользователя в виде строки и адрес электронной почты в качестве необязательной строки.

Загрузка редактора…
Показать подсказку

Используйте синтаксическую строку email?:, чтобы пометить ее как необязательную.

Решение доступно после 3 попыток

Упражнение 2. Псевдоним типа Point2D

Упражнение#ts.m2.l1.e2
Попыток: 0Загрузка…

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

Загрузка редактора…
Показать подсказку

Используйте тип синтаксиса Point2D = { x: Number; у: число; };

Решение доступно после 3 попыток

Упражнение 3. Расширение интерфейсов

Упражнение#ts.m2.l1.e3
Попыток: 0Загрузка…

Определите интерфейс с именем Product с идентификатором (номером) и ценой (номером). Затем определите интерфейс с именем DiscountedProduct, который расширяет Product и добавляет необязательное свойство DiscountCode (строка).

Загрузка редактора…
Показать подсказку

Используйте расширение Product для наследования полей и добавьте строку DiscountCode?:.

Решение доступно после 3 попыток

Упражнение 4. Конфигурация сервера

Упражнение#ts.m2.l1.e4
Попыток: 0Загрузка…

Определите псевдоним типа с именем ServerConfig, представляющий объект конфигурации для сервера. Он должен содержать: хост (строку), порт (номер) и useHttps в качестве необязательного логического поля.

Загрузка редактора…
Показать подсказку

Используйте тип синтаксиса ServerConfig = {host: string; порт: номер; использоватьHttps?: логическое значение; }.

Решение доступно после 3 попыток