Уроки модуля (1/2)
Псевдонимы типов и интерфейсы
В TypeScript мы можем определить структуру сложных объектов двумя основными способами: с помощью Интерфейсов (interface) или Псевдонимов типов (type). Оба служат для описания «формы» объекта или структуры данных, но у них есть несколько фундаментальных отличий.
Интерфейсы (interface)
Интерфейс определяет контракт на структуру объекта. Это стандартный инструмент для расширяемого описания форм объектов и общедоступных API.
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)
Псевдоним типа позволяет связать новое имя с любым существующим типом, включая примитивные типы, объединения, кортежи или целые структуры объектов.
type Point = {
x: number;
y: number;
};
const coordinates: Point = { x: 10, y: 20 };Ключевые различия: объединение расширений и объявлений
Хотя interface и type являются взаимозаменяемыми для большинства обычных случаев использования, у них есть два важных различия:
1. Расширяемость (наследование)
Интерфейсы расширяются с помощью ключевого слова extends:
interface User {
username: string;
}
interface Admin extends User {
privileges: string[];
}Псевдонимы типов нельзя расширить с помощью extends, но их можно комбинировать с помощью оператора пересечения (&):
type User = {
username: string;
};
type Admin = User & {
privileges: string[];
};2. Объединение деклараций
Несколько интерфейсов с одинаковым именем в одной области автоматически объединяются компилятором:
interface User {
name: string;
}
interface User {
email: string;
}
// Now User has both 'name' and 'email'!Такое поведение не поддерживается псевдонимами типов: объявление одного и того же type дважды приведет к ошибке во время компиляции.
Попробуйте сами
Упражнение 1. Пользовательский интерфейс
Определите интерфейс с именем User, который описывает объект пользователя. Интерфейс должен содержать: идентификатор в виде числа, имя пользователя в виде строки и адрес электронной почты в качестве необязательной строки.
Показать подсказку
Используйте синтаксическую строку email?:, чтобы пометить ее как необязательную.
Решение доступно после 3 попыток
Упражнение 2. Псевдоним типа Point2D
Создайте псевдоним типа с именем Point2D, представляющий двумерную точку с координатами x и y (оба числа).
Показать подсказку
Используйте тип синтаксиса Point2D = { x: Number; у: число; };
Решение доступно после 3 попыток
Упражнение 3. Расширение интерфейсов
Определите интерфейс с именем Product с идентификатором (номером) и ценой (номером). Затем определите интерфейс с именем DiscountedProduct, который расширяет Product и добавляет необязательное свойство DiscountCode (строка).
Показать подсказку
Используйте расширение Product для наследования полей и добавьте строку DiscountCode?:.
Решение доступно после 3 попыток
Упражнение 4. Конфигурация сервера
Определите псевдоним типа с именем ServerConfig, представляющий объект конфигурации для сервера. Он должен содержать: хост (строку), порт (номер) и useHttps в качестве необязательного логического поля.
Показать подсказку
Используйте тип синтаксиса ServerConfig = {host: string; порт: номер; использоватьHttps?: логическое значение; }.
Решение доступно после 3 попыток