Уроки модуля (2/2)
Декларации и слияние
Файлы объявлений типов (с расширением .d.ts) используются в TypeScript для описания формы существующего кода JavaScript без реализации какой-либо реальной логики. Они содержат только определения типов, интерфейсы и сигнатуры функций.
Эти файлы необходимы при использовании сторонних библиотек, написанных на чистом JavaScript.
Слияние деклараций
Слияние объявлений — это поведение, при котором компилятор объединяет два или более отдельных объявлений, объявленных с одинаковым именем, в одно определение.
Самый распространенный случай — слияние интерфейсов:
interface User {
name: string;
}
interface User {
age: number;
}
// The resulting User interface has both name and age properties!
const student: User = {
name: 'Alice',
age: 23,
};Если свойства имеют одно и то же имя, они должны быть одного типа, иначе TypeScript сообщит об ошибке.
Изменение глобальных и внешних модулей
Мы можем использовать слияние объявлений для расширения интерфейсов, определенных в других модулях или в глобальной области видимости.
Например, если мы хотим добавить свойство к глобальному объекту window браузера:
declare global {
interface Window {
analyticsToken: string;
}
}Используя declare global, мы сообщаем TypeScript, что внедряем новую подпись в существующий глобальный интерфейс Window.
Попробуйте сами
Упражнение 1. Базовое объединение объявлений
В TypeScript автоматически объединяются интерфейсы с одинаковым именем в одной области. Объявите пользователя интерфейса с именем свойства: строка, затем во втором блоке объявите того же пользователя интерфейса, добавив свойство age: Number. Наконец, объявите постоянного пользователя типа User с соответствующими значениями.
Показать подсказку
Объявите интерфейс User дважды, вставив соответствующие свойства, а затем назначьте поля объекту пользователя.
Решение доступно после 3 попыток
Упражнение 2. Расширение интерфейса глобального окна
Представьте, что вы хотите расширить глобальный интерфейс Window, добавив настраиваемое свойство с именем config типа Record<string, string>. Напишите правильное объявление, используя Declare Global, чтобы объединить новое свойство с глобальным интерфейсом Window.
Показать подсказку
Используйте объявление global {interface Window { config: Record<string, string>; } }.
Решение доступно после 3 попыток