Abstract classes, interfaces and types

Abstract classes

Абстрактные классы представляют классы, определенные с ключевым словом abstract. Создать объект абстрактного класса напрямую нельзя. Как правило абстрактные классы описывают сущности, которые в реальности не имеют конкретного воплощения

Interfaces

Интерфейс определяет свойства и методы, которые объект должен реализовать. Определяются ключевым свойством interface.

Интерфейсы могут быть реализованы не только объектами, но и классами. Для этого используем ключевое свойство implements. Интерфейс может содержать свойства только для чтения, значение которых нельзя менять (определяем свойства с помощью ключевого свойства readonly)

Расширение интерфейса

TypeScript позволяет добавлять в интерфейс новые поля и методы, просто объявив интерфейс с тем же именем и определив в нем необходимые поля и методы. Например:

interface ICar {
   color: string
}
interface ICar {
   seats: number
}
let car: ICar = {
   color: "blue",
   seats: 4,
}

Отличия интерфейсов и абстрактных классов

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

  • Интерфейс описывает только поведение — методы и поля

  • Наследник абстрактного класса обязан наследовать все его составляющие, а интерфейс создан только для реализации (имплементирования)

Type

Позволяет определять псевдонимы типов с помощью ключевого слова type

type id = number | string

Псевдонимы могут заимствовать и расширять код других:

type Person = {name: string}
type Employee = Person & {company: string}

Отличия Type от Interface

  • interface для объектов, а type для различных типов. Если говорить про использование этих сущностей для объектов, то они взаимозаменяемы. Если говорить не об объектах, то для них мы должны использовать type:

type Callback = (event: any) => void
type UUID = string
  • Интерфейсы можно имплементировать, типы нельзя

  • Псевдонимы типов

type UUID = string
const uuid: UUID = '...'
  • type не умеет в слияние в тип с одним значением, а интерфейсы умеют

  • Типы могут в объединение (|) и в пересечение (&), а интерфейсы не умеют

Last updated