Множественное наследование интерфейсов

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

Тренажер по TypeScript

Одной из сильных сторон TypeScript является возможность создавать сложные структуры данных через комбинацию простых. Множественное наследование интерфейсов позволяет одному интерфейсу наследовать свойства и методы сразу от нескольких других.

Используя ключевое слово extends, вы можете перечислить родительские интерфейсы через запятую: interface Manager extends Person, Employee. Результирующий интерфейс будет требовать наличия полей всех перечисленных родителей. Это ключевой прием в объектно-ориентированном проектировании и разработке масштабируемых приложений.

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

Список тем

1. Ключевые слова наследования

id: 40681_ts_multi_replace_01

В этом задании вам нужно объявить интерфейс, который наследует несколько других интерфейсов. В TypeScript для множественного наследования интерфейсов используется ключевое слово extends, после которого перечисляются родительские интерфейсы через запятую. Дополните фрагмент кода, вставив пропущенные элементы, чтобы интерфейс Employee корректно наследовал интерфейсы Person и Contact. Обратите внимание на синтаксис и порядок перечисления интерфейсов.

Заполните пропуски
interface Person {
  name: string;
  age: number;
}

interface Contact {
  email: string;
  phone: string;
}

interface Employee input1S Person input2S Contact {
  employeeId: number;
  department: string;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Источники свойств

id: 40681_ts_multi_sort_02

Перед вами список свойств, которые могут использоваться в TypeScript-интерфейсах. Распределите каждое свойство в соответствующую категорию: «Интерфейс Person» (общие характеристики человека) или «Интерфейс Employee» (характеристики сотрудника). Учтите, что Employee расширяет Person, поэтому свойства, общие для любого человека, должны быть в Person, а специфичные для рабочего контекста — в Employee. Всего нужно распределить 8 элементов.

Перетяните элементы в соответствующие блоки
Интерфейс Person
Интерфейс Employee
name: string;
salary: number;
age: number;
department: string;
email: string;
employeeId: number;
address: string;
jobTitle: string;
Сообщения
Проверить
Показать подсказку

3. Создание наследника

id: 40681_ts_multi_build_03

Из предложенных строк соберите корректное объявление интерфейса SmartPhone на TypeScript, который наследует от интерфейсов Phone и Computer. Интерфейс SmartPhone должен добавлять метод sendSMS. Убедитесь, что используются только необходимые строки, а лишние (не относящиеся к объявлению этих трёх интерфейсов) — исключены. Код должен быть синтаксически корректным и соответствовать теме множественного наследования интерфейсов.

Перетяните в правильном порядке строки из одного блока в другой
interface Phone {
    call(number: string): void;
}
interface Computer {
    browse(url: string): void;
}
interface SmartPhone extends Phone, Computer {
    sendSMS(message: string): void;
}
class SmartDevice implements Phone, Computer {
    takePhoto(): void;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Реализация объединенного интерфейса

id: 40681_ts_multi_select_fill_04

В этом задании вам предстоит реализовать объект типа FlyingCar, который наследует два интерфейса: Car и Plane. В коде ниже заполните пропуски (input1, input2, input3) подходящими значениями из выпадающего списка. Учтите, что объект должен соответствовать обоим интерфейсам: иметь свойства brand и wheels от Car, а также wings от Plane. Обратите внимание на типы данных: brand - строка, wheels и wings - числа.

Нужно правильно расставить в пропуски предложенные варианты
interface Car {
  brand: string;
  wheels: number;
  drive(): void;
}

interface Plane {
  model: string;
  wings: number;
  fly(): void;
}

interface FlyingCar extends Car, Plane {}

const myFlyingCar: FlyingCar = {
  brand: input1S,
  wheels: input2S,
  drive() {
    console.log("Driving on the road");
  },
  model: "FlyingX",
  wings: input3S,
  fly() {
    console.log("Flying in the sky");
  }
};
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Пропущенное свойство

id: 40681_ts_multi_error_05

В этом фрагменте кода TypeScript интерфейс C расширяет интерфейсы A и B, используя множественное наследование. Класс MyClass реализует интерфейс C, но в нём неправильно объявлено одно из свойств, унаследованных от родительских интерфейсов. Найдите строку с ошибкой и исправьте её, чтобы класс корректно реализовывал все обязательные свойства интерфейса C.

Найдите ошибку и исправьте
interface A { a: number; }
interface B { b: string; }
interface C extends A, B { c: boolean; }
 
class MyClass implements C {
  a = 10;
  c = true;
  b: number;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Выбор родительских интерфейсов

id: 40681_ts_multi_click_06

Внимательно изучите приведённый фрагмент кода на TypeScript, содержащий объявления интерфейсов. Ваша задача — найти и выделить кликом все имена интерфейсов, которые используются как родительские в конструкции `extends`. Обратите внимание, что один и тот же интерфейс может выступать родителем несколько раз в разных местах, и каждое такое использование нужно отметить отдельно. Не отмечайте имена интерфейсов в их собственном объявлении (после ключевого слова `interface`) и не отмечайте дочерние интерфейсы (те, которые расширяют другие).

Кликните по всем фрагментам, которые подходят под условие задания.
interface {{Shape~|~t1}} {
  color: string;
}

interface {{PenStroke~|~t2}} {
  penWidth: number;
}

interface {{Square~|~t3}} extends {{Shape~|~t4}}, {{PenStroke~|~t5}} {
  sideLength: number;
}

interface {{Circle~|~t6}} extends {{Shape~|~t7}} {
  radius: number;
}

interface {{Drawable~|~t8}} {
  draw(): void;
}

interface {{DrawableSquare~|~t9}} extends {{Square~|~t10}}, {{Drawable~|~t11}} {
  clear(): void;
}
Сообщения
Проверить
Показать подсказку

7. Порядок проверки типов

id: 40681_ts_multi_analyze_07

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

interface Shape {
  color: string;
}

interface Border {
  borderWidth: number;
}

interface Square extends Shape, Border {
  sideLength: number;
}

const mySquare: Square = {
  color: 'blue',
  borderWidth: 2,
  sideLength: 10
};

console.log(mySquare);
Расположите элементы в логичном порядке
Объявление базового интерфейса Border с обязательным свойством borderWidth: number
Проверка компилятором: объект должен содержать свойство color из интерфейса Shape
Объявление интерфейса Square, который наследует Shape и Border через extends и добавляет свойство sideLength: number
Проверка компилятором: объект должен содержать свойство sideLength из интерфейса Square
Объявление базового интерфейса Shape с обязательным свойством color: string
Создание объекта mySquare с явным указанием типа Square и инициализация всех свойств
Проверка компилятором: объект должен содержать свойство borderWidth из интерфейса Border
Вывод объекта mySquare в консоль после успешной проверки типов
Сообщения
Проверить
Показать подсказку

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

id: 40681_compiler

Погрузитесь в мощь множественного наследования интерфейсов! Здесь мы создаем универсальный гаджет, объединяя свойства разных интерфейсов в один. Попробуйте добавить новый интерфейс, например, `HasGPS`, и расширить им `SmartDevice` — вы увидите, как строго TypeScript следит за тем, чтобы объект реализовал абсолютно все свойства. Экспериментируйте: добавляйте свои методы, меняйте типы данных и создавайте свои собственные комбинации интерфейсов, чтобы понять, как строить гибкие архитектуры!

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