Gernar
TypeScript

Как наследуются от класса в TypeScript

Разбор вопроса «Как наследуются от класса в TypeScript» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Как наследуются от класса в TypeScript

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат понимает механизм наследования в TypeScript, включая использование extends, super(), и модификаторов доступа. Также важно знание переопределения методов и добавления новых членов класса.

Ключевые тезисы

  • В TypeScript наследование реализуется с помощью ключевого слова extends, которое позволяет дочернему классу наследовать свойства и методы родительского класса.
  • Дочерний класс может переопределять методы родительского класса, а также добавлять новые свойства и методы.
  • Для вызова конструктора родительского класса из дочернего используется super(), что обязательно, если у родительского класса есть конструктор.
  • TypeScript поддерживает модификаторы доступа (public, private, protected), которые влияют на видимость членов класса при наследовании.

Подробный ответ

Наследование в TypeScript реализуется с помощью ключевого слова extends, которое позволяет дочернему классу наследовать свойства и методы родительского класса. Это позволяет создавать иерархии классов, где дочерние классы могут расширять функциональность родительских классов. Дочерний класс может переопределять методы родительского класса, а также добавлять новые свойства и методы. Это полезно для создания специализированных классов на основе уже существующих. Для вызова конструктора родительского класса из дочернего используется super(), что обязательно, если у родительского класса есть конструктор. TypeScript поддерживает модификаторы доступа (public, private, protected), которые влияют на видимость членов класса при наследовании. Например, приватные члены родительского класса недоступны в дочернем классе, а защищенные (protected) доступны только внутри иерархии классов.

Практические примеры

Пример 1

Базовый пример наследования.

class Animal {
  constructor(public name: string) {}
  move(distance: number = 0) {
    console.log(`${this.name} moved ${distance}m.`);
  }
}
class Dog extends Animal {
  constructor(name: string, public breed: string) {
    super(name);
  }
  bark() {
    console.log('Woof! Woof!');
  }
}
const dog = new Dog('Rex', 'German Shepherd');
dog.move(10);
dog.bark();

Пример 2

Переопределение метода.

class Bird extends Animal {
  move(distance: number = 5) {
    console.log(`${this.name} flew ${distance}m.`);
  }
}
const bird = new Bird('Sparrow');
bird.move();

Пример 3

Использование модификаторов доступа.

class Person {
  protected age: number;
  constructor(age: number) {
    this.age = age;
  }
}
class Employee extends Person {
  constructor(age: number, public department: string) {
    super(age);
  }
  getEmployeeAge() {
    return this.age;
  }
}
const employee = new Employee(30, 'IT');
console.log(employee.getEmployeeAge());

Частые ошибки

  • Типичная ошибка — забыть вызвать super() в конструкторе дочернего класса, если родительский класс имеет конструктор. Это приведет к ошибке компиляции.
  • Другая ошибка — попытка доступа к приватным членам родительского класса из дочернего класса. Это невозможно, так как приватные члены доступны только внутри класса, где они объявлены.

Связанные темы

  • Модификаторы доступа в TypeScript (public, private, protected)
  • Интерфейсы и абстрактные классы в TypeScript
  • Множественное наследование и миксины в TypeScript
  • Декораторы классов в TypeScript

Follow-up вопросы

Что происходит, если дочерний класс не вызывает super() в конструкторе?

Уровень: basic

Если дочерний класс не вызывает super() в конструкторе, TypeScript выдаст ошибку, так как вызов super() обязателен для инициализации родительского класса.

Как работает переопределение методов в дочернем классе?

Уровень: intermediate

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

Какие модификаторы доступа доступны в TypeScript и как они влияют на наследование?

Уровень: intermediate

TypeScript поддерживает модификаторы public, private и protected. Public члены доступны везде, private — только внутри класса, а protected — внутри класса и его наследников.

Может ли дочерний класс наследовать приватные члены родительского класса?

Уровень: advanced

Нет, приватные члены родительского класса (private) недоступны в дочернем классе. Для доступа к таким членам в наследниках используется модификатор protected.

Как в TypeScript реализовать множественное наследование?

Уровень: advanced

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

Содержание