В чем разница между Interface и абстрактным классом

«В чем разница между Interface и абстрактным классом» — вопрос из категории TypeScript, который задают на 10% собеседований Frontend Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Interface определяет только структуру (методы и свойства) без реализации, а классы могут реализовывать несколько интерфейсов.

Абстрактный класс может содержать как абстрактные методы (без реализации), так и конкретные. От него можно наследоваться, но только один класс.

// Interface
interface Animal {
  name: string;
  makeSound(): void;
}

// Abstract class
abstract class Bird {
  abstract fly(): void;
  eat() { console.log("Eating..."); }
}

class Parrot extends Bird implements Animal {
  name = "Parrot";
  makeSound() { console.log("Squawk!"); }
  fly() { console.log("Flying..."); }
}

Ключевые отличия:

  • Интерфейсы — только контракты, абстрактные классы — частичная реализация.
  • Интерфейсы поддерживают множественное наследование, абстрактные классы — нет.
  • Абстрактные классы могут иметь модификаторы доступа (protected, private), интерфейсы — только public.