Расширение интерфейсов (extends)

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

Тренажер по TypeScript

Расширение интерфейсов через ключевое слово extends позволяет создавать новые интерфейсы на основе существующих, наследуя все их свойства. Это основа для построения иерархий типов и переиспользования кода.

interface Animal { name: string; }
interface Dog extends Animal { breed: string; }

Интерфейс Dog содержит и name от Animal, и собственное свойство breed. TypeScript поддерживает множественное расширение:

interface Pet extends Animal, Identifiable { ... }

Практические задания помогут разобраться с наследованием интерфейсов, переопределением свойств и разрешением конфликтов при множественном расширении.

Список тем

1. Базовое расширение

id: 40680_extends_01_replace

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

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

interface Employee input1S input2S {
  employeeId: number;
  department: string;
}

const newEmployee: Employee = {
  name: 'Alice',
  age: 28,
  employeeId: 101,
  department: 'Engineering'
};

console.log(newEmployee.name);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Ошибка в расширении

id: 40680_extends_02_error

В данном фрагменте кода TypeScript присутствует ошибка, связанная с расширением интерфейса. Внимательно изучите код и найдите строку, где допущена синтаксическая ошибка при попытке наследования одного интерфейса от другого. Исправьте эту строку, чтобы интерфейс мог корректно расширять базовый интерфейс и код стал валидным.

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

3. Собери цепочку интерфейсов

id: 40680_extends_03_build

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

Перетяните в правильном порядке строки из одного блока в другой
interface Vehicle {
  make: string;
  model: string;
}
interface Car extends Vehicle {
  doors: number;
}
interface ElectricCar extends Car {
  batteryCapacity: number;
}
interface Bicycle {
  wheels: number;
}
interface Truck extends Vehicle {
  cargoCapacity: number;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Множественное расширение

id: 40680_extends_04_select

В этом задании вам предстоит дополнить код TypeScript, в котором интерфейс расширяет несколько базовых интерфейсов. В коде ниже пропущены имена базовых интерфейсов, которые необходимо выбрать из предоставленного списка. Ваша задача — заполнить пропуски, чтобы интерфейс `User` корректно расширял все необходимые базовые интерфейсы и включал все требуемые свойства. Обратите внимание на логику наследования свойств и типов при множественном расширении интерфейсов.

Нужно правильно расставить в пропуски предложенные варианты
interface Identifiable {
  id: number;
}

interface Named {
  name: string;
}

interface Timestamped {
  createdAt: Date;
}

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

5. Какие свойства будут?

id: 40680_extends_05_predict

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

Выберите правильный вариант ответа
interface Base {
  id: number;
}

interface Person extends Base {
  name: string;
  age: number;
}

interface Employee extends Person {
  department: string;
  getSalary(): number;
}

interface Manager extends Employee {
  teamSize: number;
  manage(): void;
}

let director: Manager;
Сообщения
Проверить
Показать подсказку

6. Базовый и расширенный

id: 40680_extends_06_compare

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Содержит только базовые свойства (например, name: string)
Добавляет новые свойства к базовому интерфейсу (например, age: number)
Может переопределять типы свойств (например, сделать свойство необязательным)
Может добавлять новые методы
Может расширять несколько интерфейсов одновременно
interface Developer extends Person, Employee {
  skills: string[];
}
interface Person {
  name: string;
}
interface Employee extends Person {
  age: number;
}
interface Manager extends Employee {
  manage(): void;
}
interface OptionalPerson extends Person {
  name?: string;
}
Сообщения
Проверить
Показать подсказку

7. Анализ иерархии

id: 40680_extends_07_analyze

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

interface PersonBase {
  name: string;
}

interface PersonWithAge extends PersonBase {
  age: number;
}

interface PersonWithRole extends PersonWithAge {
  role: string;
}

const employee: PersonWithRole = {
  name: "Alice",
  age: 30,
  role: "Developer"
};

console.log(employee);
Расположите элементы в логичном порядке
Создан интерфейс PersonWithRole, который расширяет PersonWithAge и добавляет новое обязательное свойство role типа string.
Определён базовый интерфейс PersonBase с обязательным свойством name типа string.
Объект employee инициализирован значениями для всех трёх обязательных свойств: name, age и role.
Объявлена константа employee с типом PersonWithRole, что означает, что объект должен реализовать все свойства из цепочки наследования.
Создан интерфейс PersonWithAge, который расширяет PersonBase и добавляет новое обязательное свойство age типа number.
Объект employee выводится в консоль, демонстрируя итоговую структуру данных.
Сообщения
Проверить
Показать подсказку

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

id: 40680_compiler

В этом упражнении мы изучим, как создавать сложные структуры данных, расширяя существующие интерфейсы с помощью ключевого слова `extends`. Вы увидите, как интерфейс `Employee` наследует все свойства от `Person`, избавляя нас от дублирования кода. Попробуйте добавить новое поле в базовый интерфейс `Person` и посмотрите, как TypeScript мгновенно потребует его наличия во всех дочерних объектах. Экспериментируйте: создайте свой интерфейс `Manager`, который расширяет `Employee`, добавьте ему уникальные свойства и попробуйте создать объект для него!

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