Declaration Merging

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Declaration Merging (слияние объявлений) — это механизм TypeScript, позволяющий объединять несколько объявлений с одинаковым именем в единое определение.

Чаще всего применяется для интерфейсов: если объявить интерфейс с тем же именем повторно, TypeScript автоматически объединит все свойства в один тип.

  • Позволяет расширять интерфейсы библиотек без изменения исходного кода
  • Работает для интерфейсов, пространств имён и некоторых других конструкций
  • Свойства с одинаковыми именами должны иметь совместимые типы

Этот тренажёр поможет на практике разобраться с примерами слияния объявлений и типичными ошибками при использовании этой возможности TypeScript.

Список тем

1. Базовое слияние интерфейсов

id: 40683_merge_01_basic

В TypeScript интерфейсы могут быть объявлены несколько раз, и их объявления автоматически сливаются. В этом задании вам нужно дополнить два объявления одного интерфейса. Заполните пропуски так, чтобы получился корректный TypeScript-код, в котором интерфейс User имеет свойства name (строка), age (число) и email (строка). Обратите внимание, что оба объявления должны иметь одинаковое имя.

Заполните пропуски
input1S User {
    name: input2S;
    age: number;
}

input3S input4S {
    email: string;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Собери код с объединением интерфейсов

id: 40683_merge_02_build

Из предложенных строк соберите корректную TypeScript-программу, которая демонстрирует объединение интерфейсов (declaration merging). Программа должна объявить интерфейс Product дважды с разными свойствами, создать объект, соответствующий этому интерфейсу, и вывести все его свойства в одном console.log. Некоторые строки лишние и не должны входить в решение.

Перетяните в правильном порядке строки из одного блока в другой
interface Product { name: string; price: number; }
interface Product { category: string; }
const product: Product = { name: 'Laptop', price: 1500, category: 'Electronics' };
console.log(`Name: ${product.name}, Price: ${product.price}, Category: ${product.category}`);
interface AnotherInterface { id: number; }
console.log(product.manufacturer);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Конфликт типов при слиянии

id: 40683_merge_03_error

В этом фрагменте TypeScript-кода есть два объявления интерфейса с одинаковым именем. При слиянии этих объявлений возникает конфликт типов для одного из свойств. Найдите строку с конфликтующим типом и исправьте её, чтобы интерфейсы могли быть корректно объединены без ошибок компиляции.

Найдите ошибку и исправьте
interface Person {
  name: string;
  age: number;
}
 
interface Person {
  name: number;
  city: string;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Какие свойства будут в итоговом интерфейсе

id: 40683_merge_04_predict

Проанализируйте три объявления интерфейса Car в TypeScript. Учитывая механизм Declaration Merging (объединения объявлений), определите, какой набор свойств с указанием их типов и модификаторов будет доступен в итоговом интерфейсе Car. Выберите все верные варианты из предложенных ниже.

Выберите правильный вариант ответа
interface Car {
  brand: string;
}

interface Car {
  model: string;
  year?: number;
}

interface Car {
  readonly VIN: string;
  year: number;
}
Сообщения
Проверить
Показать подсказку

5. Анализ кода с расширением интерфейса

id: 40683_merge_06_analyze

Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как TypeScript обрабатывает слияние объявлений интерфейсов, создание объекта и вызов методов.

interface Person {
  name: string;
  greet(): void;
}

interface Person {
  age: number;
  celebrate(): void;
}

const john: Person = {
  name: "John",
  age: 30,
  greet() {
    console.log(`Hello, I'm ${this.name}`);
  },
  celebrate() {
    console.log(`Celebrating ${this.age} years!`);
  }
};

john.greet();
john.celebrate();
Расположите элементы в логичном порядке
Вызов метода greet() у объекта john (обращение к первому объявлению интерфейса)
Объявление первого интерфейса Person с полем name и методом greet
Вызов метода celebrate() у объекта john (обращение ко второму объявлению интерфейса)
TypeScript автоматически выполняет слияние (declaration merging) двух объявлений в один интерфейс Person
Создание объекта john, который соответствует объединённому интерфейсу Person
Объявление второго интерфейса Person с полем age и методом celebrate
Сообщения
Проверить
Показать подсказку

6. Что можно объединять в TypeScript

id: 40683_merge_07_sort

Перед вами список конструкций языка TypeScript. Разнесите их по двум категориям в соответствии с тем, поддерживают ли они слияние объявлений (declaration merging). Слияние объявлений — это особенность TypeScript, позволяющая комбинировать несколько отдельных объявлений с одним и тем же именем в одно. Каждый элемент однозначно относится только к одной категории.

Перетяните элементы в соответствующие блоки
Поддерживают слияние объявлений
Не поддерживают слияние объявлений
interface
type alias
class
namespace
enum
function
variable
const
Сообщения
Проверить
Показать подсказку

7. Отметь все свойства итогового интерфейса

id: 40683_merge_08_click

Перед вами три объявления интерфейса с одинаковым именем `User`. В TypeScript при использовании declaration merging (объединении объявлений) они сливаются в один итоговый интерфейс. Ваша задача — внимательно изучить код и отметить кликом только те свойства, которые будут присутствовать в итоговом объединённом интерфейсе `User`. Не отмечайте свойства, которые приведут к ошибке из-за несовместимости типов, или свойства, объявленные в других, не связанных интерфейсах.

Кликните по всем фрагментам, которые подходят под условие задания.
// Первое объявление интерфейса User
interface User {
{{id~|~t1}}: number;
{{name~|~t2}}: string;
}

// Второе объявление интерфейса User
interface User {
{{email~|~t3}}: string;
{{id~|~t4}}: string; // Ошибка: несовместимый тип
{{age~|~t5}}: number;
}

// Третье объявление интерфейса User
interface User {
{{phone~|~t6}}: string;
{{isActive~|~t7}}: boolean;
}

// Интерфейс Admin (не участвует в объединении)
interface Admin {
permissions: string[];
}

Отметьте свойства итогового интерфейса User:

  • {{id~|~t8}} (number)
  • {{name~|~t9}} (string)
  • {{email~|~t10}} (string)
  • {{age~|~t11}} (number)
  • {{phone~|~t12}} (string)
  • {{isActive~|~t13}} (boolean)
  • {{permissions~|~t14}} (string[])
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40683_compiler

В TypeScript есть удивительная особенность: если объявить два интерфейса с одинаковым именем, они автоматически «склеятся» в один! Это называется Declaration Merging. Попробуйте добавить третье объявление интерфейса `User` с новым свойством, например `role: string`, и вы увидите, что TypeScript мгновенно потребует его наличия в объекте. Экспериментируйте: добавляйте методы в одну часть интерфейса, а свойства в другую, чтобы понять, как можно расширять даже чужие библиотеки!

TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру