Классы¶
Причина, по которой важно иметь классы в 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 | |