Рубріки: Front-end

Как JavaScript превращается в TypeScript, но все никак не превратится

Павло Бєлавін

В блоге на ресурсе Bits and Pieces разработчик Махди Резви (Mahdhi Rezvi) сравнивает JavaScript (JS) и TypeScript (TS) и рассуждает о том, как эти языки становятся все более похожи. Сначала напомним, что из себя представляют два этих языка.

JavaScript

Это незаменимый элемент стандартных веб-технологий, обеспечивающий интерактивность веб-страницам. Как и любой другой язык программирования, JS поддерживает регулярные обновления. Так, в июне 2020 года состоялся релиз новой версии ECMAScript — ES2020.

TypeScript

Этот опенсорсный язык программирования разработан корпорацией Microsoft в 2012 году. Считается, что он потребовался для расширения возможностей JavaScript, в который он и компилируется в конечном итоге. TS стремительно развивается и набирает популярность среди веб-разработчиков.

Первое время TS тесно ассоциировался в сообществе разработчиков с платформой Angular, которую разрабатывает команда из Google. Это не удивительного: Angular вынуждала использовать именно TS, что, впрочем, преодолимо.

Кто популярнее?

За последние годы популярность TS настолько выросла, что он сумел преодолеть три строчки в рейтинге самых популярных языков программирования за один год и в 2020 году занял четвертое место.

Самые популярные языки программирования. Источник: Octoverse

TypeScript в Google Trends

И все же, как видно на графиках, до популярности JS ему пока что далеко.

JavaScript и TypeScript в Google Trends

В общем, пока JS это мировой океан, а TS просто гигантское цунами на его поверхности.

Оба языка — JS и TS — проделали немалый путь, а теперь, чтобы продолжать расти, им требуется обеспечивать свою аудиторию разработчиков наиболее востребованными функциями — причем без оглядки на то, кто сделал это первым.

Наблюдения и выводы

От внимательного разработчика, пристально изучившего оба языка, не укроется тот факт, что многие новые функции, появляющиеся в JS, до этого уже были реализованы в TS. Речь, конечно, не о прямом копировании, но, вероятно, влияние есть. Глядя на TS, разработчики JS внедряют то, что стало востребовано.

К примеру, в своей статье Резви приводит цитату из интервью с польским разработчиком Адамом Полаком: «JS все больше и больше черт перенимает у TS. И хотя TS одним своим существованием делает JS лучше, сомнительно, что когда-нибудь последний вберет в себя весь функционал TS».

С этим мало кто поспорит, хотя бы потому, что начало использования статической типизации в языке с изначально динамической типизацией его полностью бы изменило. И все же нельзя не признать наличие в JS некоторых свойств, на которые повлиял TS. Вот ряд примеров:

Классы

Вы наверняка в курсе, что изначально JS не имел поддержки классов, наследование стало возможно благодаря концепту прототипного наследования. В то же время TS всегда позволял использование классов в своем коде, что и было скомпилировано в JS.

JS пришлось ввести концепцию классов в релизе ES6 следом за TS, но по сути это просто синтаксическая конструкция. Классы в ES6 — это «синтаксический сахар» для прототипного наследования традиционного JS, то есть эта функция не делает JS языком объектно-ориентированного программирования (ООП) в чистом виде.

Но то же самое сделали и создатели TS, их вариация применяет то же самое прототипное наследование, что и традиционный JS. Они просто использовали предложенную ECMAScript в будущем поддержку программирования на основе классов, поэтому вряд ли это можно рассматривать в качестве классического варианта влияния одного языка на другой.

Опциональная цепочка

Эта удобная функция уже была в TS в 2019 году, но пользователям JS она стала доступна лишь год спустя, когда вошла в релиз ES2020.

Опциональная цепочка — это простейшая функция, дающая безопасный доступ к глубоко вложенным свойствам объекта, без необходимости проверять существование каждого из них. Оператор ?. дает доступ к свойствам объекта, его использование очень схоже с привычным оператором , но если значение перед ним undefined или null, вместо ошибки он вернет undefined.

В итоге получается более простой и ясный код, в котором гарантированно не будут выскакивать ошибки во время вызова объектов с неопределенными свойствами.

Оператор нулевого слияния

Функция Nullish Coalescing появилась в релизе TS 3.7 в 2019 году. В JS решили не отставать от современных трендов, и в своем релизе 2020 года ES2020 представили ту же функцию наряду с опциональной цепочкой. Выглядит так, словно именно у TS создатели JS почерпнули идею того, что может понравиться их пользователям.

Оператор нулевого слияния ?? при проверке переменной считает false только значения null или undefined. При этом обычные логические операторы приводят к false следующие значения: 0, undefinednullfalse и NaN. Может показаться, что тут нет большой разницы, но она огромна.

Приватные переменные

Стоило разработчикам познакомиться с синтаксической конструкцией класса, вызвавшей ощущение схожести JS с языком ООП, как сразу же захотелось еще больше соответствующих языку ООП функций. В их числе была и приватная переменная, но прежде чем она появилась в релизе JS, свои подобные переменные представил TS. В его варианте определение переменных весьма схоже с теми, что используются в других языках ООП, основаны они на использовании ключевого слова private.

Приватные переменные в JS все еще находятся на третьей стадии процесса разработки стандарта ТС39, но должны увидеть свет уже скоро. В противовес тому, как подошли к реализации функции в TS, в JS решили использовать в качестве обозначения своей приватной переменной символ #.

На основе этого предложения TypeScript в своем релизе 3.8 представил поддержку около-приватного подхода. И тут у разработчиков возник выбор одного из двух вариантов, а вместе с ним споры — какой лучше?

В этой неразберихе свой взгляд на проблему представила команда разработчиков TS:

«Если говорить о свойствах, то при использовании модификаторов private в TS они полностью стираются, то есть во время выполнения они ничем не отличаются от обычного свойства и невозможно сказать, что тут был объявлен модификатор private. При использовании ключевого слова private, конфиденциальность обеспечена только на стадии компиляции или во время разработки, тогда как у пользователей JS это целиком изначальная функция.

Плюс в том, что это своего рода «управляемая приватность», помогающая пользователям временно обойти отсутствие доступа к какому-либо API и вместе с тем работать с любым периодом исполнения программы.

С другой стороны, предлагаемый в ECMAScript символ # для обозначения приватности совершенно недоступен вне класса. Такая устойчивая конфиденциальность полезна, когда нужна уверенность, что никто не сможет использовать никакие из ваших внутренних переменных. Если вы создатель библиотеки, удаление или переименование скрытого поля не должно приводить к нарушению перехода».

Декораторы

Для тех, кто с ними знаком, декораторы — это удобная функция, которая используется уже давно. Например, во фреймворке Angular перед вашими компонентами будет стоять @Component. Кроме того, вы наверняка видели такие обозначения, как @Injectable или @Directive. Их и называют декораторами.

В TS они не первый день, но в JS существовали намного дольше, просто не имели особого синтаксиса. Пока что эта функция находится у JS на втором этапе предложения и не входит в стандарт. В TS ее отмечают как экспериментальную и требуют от пользователей настроить доступ к ее использованию в файле конфигурации tsconfig.json.

О будущих изменениях

В своей статье Ревзи приводит пример функций, которые в скором времени должны или могут появиться в JS.

Интерфейс

Изначально в языках ООП интерфейсы применялись для достижения абстракции. JS пока не поддерживает интерфейсы по умолчанию. Кроме того, JS работает скорее не на наследовании на основе классов, а на основе объектов. Появление ключевого слова class было призвано создать ощущение использования классов.

Разработчики JS внедряют эту функцию на основе концепта, называемого Duck Typing («утиная типизация»). Для реализации этой функции были разработаны библиотеки, например,  implement.js.

Круто было бы иметь подобную функцию по умолчанию. Команда JS могла бы пойти по тому же пути реализации интерфейсов, что и в случае с классами, используя «синтаксический сахар» для «утиной типизации».

Пространство имен

Еще одна очень полезная функция в TS.  Она очень похожа на заполнители в языке C# и пакеты в Java.

«Пространство имен можно рассматривать, как логическое группирование единиц кода с уникальным идентификатором. На идентификатор может ссылаться множество пространств имен, а каждый идентификатор может содержать в себе собственную иерархию составных (или внутренних) пространств имен», — приводит Ревзи цитату из блога разработчика Google Адди Османи.

Как и в случае с интерфейсами, функция пространства имен не реализована в JS по умолчанию. Поэтому она реализуется в приложениях JS через применение нескольких паттернов проектирования с помощью объектов и замыканий.

Вряд ли это одна из самых долгожданных функций, зато, уверен Ревзи, у команды JS ее реализация не вызовет особых сложностей.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023