Несмотря на то что объявление типов переменных вынуждает разработчиков писать больше кода, их продуктивность растет в долгосрочной перспективе. • TypeScript предлагает ряд аннотаций типов, но можно также объявлять пользовательские. • Можно создавать новые типы, объявляя объединение существующих. • Можно объявлять пользовательские типы с помощью ключевых слов type, interface и class. В главе 4 вы увидите еще один способ объявления пользовательских типов, уже с использованием ключевого слова enum. • TypeScript использует структурную систему типов в противоположность Java или C#, которые используют номинальную.
Мы показали вам, что пользовательский тип может быть объявлен с помощью ключевых слов type, class либо interface. Какое же из них лучше всего использовать для объявления пользовательского типа Person? Если этот тип не нужен для инстанцирования объектов в среде выполнения, используйте interface или type.
Если метод в подклассе хочет вызвать метод с таким же именем, определенный в суперклассе, то при обращении к этому методу ему нужно использовать ключевое слово super вместо this.
Используя квалификаторы доступа с аргументами конструктора, мы можем дать команду компилятору TypeScript создавать свойства класса, имеющие те же имена, что и аргументы конструктора. Компилятор будет автоматически генерировать JavaScript-код, присваивающий значения, переданные конструктору, свойствам класса.
TypeScript же является надмножеством JavaScript, который не поддерживает ключевое слово private, поэтому private, protected (а также public) удаляются при компиляции кода. Итоговый JavaScript-код не будет содержать их, поэтому вы можете рассматривать эти ключевые слова просто как помощь при разработке.
Изнутри JavaScript поддерживает объектное наследование через прототипы, когда один объект может быть присвоен другому в качестве его прототипа, — это происходит при выполнении. Как только TypeScript-код, использующий наследование, скомпилирован, получившийся JavaScript использует синтаксис прототипного наследования.
Наши классы не определяли методы, но если бы они оба определили методы с одинаковой сигнатурой (имя, аргументы и возвращаемый тип), то опять же были бы совместимы.
TypeScript использует структурную систему типов, а это означает, что если два разных типа включают одинаковые члены, то эти типы считаются совместимыми.
Модификаторы уровня доступа влияют на совместимость типов. Например, если мы объявим свойство name класса Person как private, то код в листинге 2.19 не скомпилируется.
Если вы объявляете пользовательский тип просто для дополнительной безопасности, предлагаемой модулем проверки типов в TypeScript, используйте type или interface. Ни интерфейсы, ни типы, объявленные с ключевым словом type, не имеют представления в генерируемом JavaScript-коде, что уменьшает размер кода среды выполнения (байтовый). Если же для объявления типов вы используете классы, то они оставят свой след в итоговом JavaScript.