Классы¶
Причина, по которой важно иметь классы в JavaScript:
- Классы предлагают полезную структурную абстракцию
- Предоставляют разработчикам согласованный единый способ использования классов вместо разных версий, предлагаемых фреймворками (emberjs, reactjs).
- Разработчики с опытом ООП уже понимают классы
На текущий момент JavaScript разработчики могут использовать class
. Далее реализация базового класса Point
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Этот класс компилируется в следующий код для ES5:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Это традиционная базовая модель класса в JavaScript.
Наследование¶
Классы в TypeScript (как и в других языках) поддерживают одиночное наследование с помощью ключевого слова extends
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Если в вашем классе есть конструктор, то вы должны вызвать конструктор класса-родителя из конструктора класса-наследника (TypeScript укажет на это). Это гарантирует, что все члены класса, которые должны быть добавлены в this
, будут добавлены корректно. После вызова super
вы можете добавить любые дополнительные члены, которые необходимы в конструкторе (в примере мы добавляем новый член z
).
Обратите внимание, что вы легко переопределяете члены класса-родителя (в примере мы переопределяем add
) и все еще используете функциональность класса-родителя (использование super.
).
Static¶
Классы в TypeScript поддерживают static
свойства, которые являются общими для всех экземпляров класса. Естественное место для их размещения (и доступа к ним) - это сам класс:
1 2 3 4 5 6 7 8 9 10 |
|
Вы можете использовать как static
члены, так и static
методы.
Модификаторы доступа¶
TypeScript поддерживает модификаторы доступа public
,private
и protected
, которые определяют доступность членов класса:
доступ к | public | protected | private |
---|---|---|---|
класс | да | да | да |
дочерний класс | да | да | нет |
экземпляр класса | да | нет | нет |
Если модификатор доступа не опеределен, то он неявно интерпретируется как public
, поскольку это соответствует природе JavaScript 🌹.
Обратите внимание, что во время выполнения (в сгенерированном JS) это не имеет значения, но во время компиляции вы получите ошибки при некорректном использовании модификаторов доступа. Как показано в примере ниже для каждого модификатора:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Как обычно, эти модификаторы работают и для члена класса, и для метода.
Abstract¶
abstract
можно рассматривать как модификатор доступа. Мы рассматриваем его отдельно, потому что, в отличие от предыдущих модификаторов, он может использоваться как для class
, так и для любого члена класса. Наличие abstract
модификатора в первую очередь означает, что данная функциональность не может быть вызвана напрямую, класс-наследник должен обеспечивать функциональность.
- Экземпляр
abstract
класса не может быть создан напрямую. Вместо этого должен быть создан какой-либоclass
, который наследуется отabstract class
. abstract
члены класса недоступны напрямую и функциональность предоставляется только через класс-наследник.
Конструктор опционален¶
Конструктор для класса не обязателен. Пример ниже прекрасно работает:
1 2 |
|
Определение с помощью конструктора¶
Добавление членов класса и инициализация, как на примере ниже:
1 2 3 4 5 6 |
|
это настолько общий паттерн, что TypeScript предоставляет сокращенный вариант, в котором достаточно добавить модификатор доступа перед членом класса и он автоматически будет проинициализирован и скопирован из конструктора. Поэтому предыдущий пример может быть переписан как:
1 2 3 |
|
Инициализация свойств¶
Это прекрасная функция, поддерживаемая TypeScript (из ES7). Вы можете инициализировать любой член класса вне конструктора, обычно с дефолтным значением.
1 2 3 4 5 6 |
|