Поиск по сайту:

Что означает предложение Microsoft по синтаксису типа ES для JavaScript


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

Синтаксис

Предлагаемый синтаксис выглядит следующим образом:

function sayAge(name: string, age: number) {
    console.log(`${name} is ${age} years old.`);
}
 
sayAge("JavaScript", 26);

Это будет знакомо всем, кто ранее использовал TypeScript, типизированный надмножество JavaScript от Microsoft. TypeScript получил широкое распространение в отрасли; это новое предложение призвано принести некоторые из его преимуществ более широкому миру JavaScript.

Что не является предложением?

Если оно будет одобрено, это предложение позволит вам написать полностью корректный JavaScript с аннотациями типов, показанными выше. Он будет принят средами выполнения JavaScript, такими как веб-браузеры, Node.js и Deno, которые соответствуют стандарту ES.

Однако предложение на самом деле не расширяет язык JavaScript. Ваши аннотации типов будут именно такими: инертными метаданными, которые не влияют на компилятор JavaScript или время выполнения вашего кода. Вызов функции, такой как следующий, будет работать во время выполнения:

function sayAge(name: string, age: number) {
    console.log(`${name} is ${age} years old.`);
}
 
// "age" is a string when it should be a number, but this is still allowed
sayAge("JavaScript", "twenty");

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

Предложение будет стремиться установить поддержку аннотирования типов параметров, переменных и свойств класса. Также можно добавить ключевое слово interface, операторы утверждения, такие как ! и as, и модификатор ? чтобы пометить типы как необязательные. Цель состоит в том, чтобы все эти элементы отражали TypeScript; как и в случае с любым предложением на этапе 0, окончательный результат может быть другим.

В чем смысл?

Если аннотации типов не изменят вашу программу, возникает очевидный вопрос, стоит ли их иметь. Предложение утверждает «да» из-за способности синтаксиса сокращать время итерации и снижать нагрузку на современные цепочки инструментов JavaScript.

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

Хотя JavaScript по своей природе является языком со слабой типизацией, преимущества строгой типизации в настоящее время широко признаны сообществом. Это видно из динамики, связанной с проектом TypeScript. Статическая типизация также была явным лидером в вопросе «отсутствующая функция» опроса State of JS 2021 года.

Добавление синтаксиса типа в сам JavaScript позволит вам получить некоторые преимущества TypeScript без необходимости компилировать код. Это упрощает настройку и обслуживание проекта, а также развивает JavaScript, чтобы лучше соответствовать современным методам разработки.

За последние несколько лет все больше кода начало возвращаться к «чистому JavaScript». Упадок устаревших браузеров делает транспиляцию менее необходимой, чем когда-то — большинство современных реализаций предлагают полную поддержку таких функций, как классы, стрелочные функции, блочные переменные и async/await. У JavaScript даже есть полноценная модульная система, которая работает во всех движках, в том числе в браузерах.

Всего несколько лет назад требовалась длинная цепочка инструментов, чтобы иметь возможность записывать эти функции в свой код с уверенностью, что он будет работать на устройствах пользователей. В настоящее время разработчики могут спокойно отложить эти процессы сборки в сторону, вернувшись к исходной модели JavaScript со ссылками на файлы с помощью тегов <script>.

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

Что на самом деле должны делать типы?

Роль «типа» варьируется в зависимости от языка. Общий демонинатор заключается в способности типа выражать тип данных, которые будут храниться в конкретной переменной. Затем на эту основу накладываются дополнительные значения, возможности и поведение.

В компилируемых языках со статической типизацией, таких как C# и Java, типы применяются во время компиляции. Невозможно скомпилировать программу, если в вашем коде есть несовместимость типов. В интерпретируемых языках с необязательной строгой типизацией, примером которых является PHP, типы применяются во время выполнения — программа выдает ошибку, когда тип значения несовместим с контекстом, в котором оно используется.

В сообществе JavaScript ведутся активные дебаты о том, насколько далеко должна простираться сфера компетенции любой встроенной системы типов. Это предложение ограничивает его роль наиболее фундаментальным элементом — простой документацией ожидаемого типа значения. Это хорошо согласуется с позицией TypeScript как синтаксиса стираемого типа, который игнорируется во время выполнения.

Цель этой модели — дать разработчикам мгновенную обратную связь о потенциальных ошибках, когда они пишут код. Вы можете получить информацию о проблемах с типами при написании обычного JavaScript в совместимой среде IDE. Если вы хотите, вы также можете использовать вспомогательный инструмент, такой как TypeScript, статический анализатор или упаковщик, для аудита вашего исходного кода по требованию. Это может заблокировать развертывание в конвейерах непрерывной интеграции при наличии проблемы с типом.

В настоящее время кажется, что этих возможностей достаточно, чтобы привести JavaScript в соответствие с наиболее распространенными потребностями разработчиков. Функции, имеющиеся в других языках, такие как самоанализ и отражение, обычно не нужны в экосистеме JavaScript, отчасти потому, что разработчики привыкли к подходу TypeScript к стиранию.

Существующая альтернатива: Docblocks

Стоит отметить, что что-то похожее на предлагаемый синтаксис стертых аннотаций уже существует: знакомые теги JSDoc обычно используются для добавления сведений о типе в простой код JavaScript:

/**
 * @param name {string}
 * @param age {number}
 */
function sayAge(name, age) {
    console.log(`${name} is ${age} years old.`);
}

Комментарии JSDoc поддерживаются различными популярными инструментами. Однако они не являются стандартизированной частью языка и требуют, чтобы вы смешивали детали работы вашего кода — его ожидаемые типы — с ориентированной на человека документацией, составляющей остальную часть докблока.

Синтаксис JSDoc также очень многословен. Помимо обязательных имен тегов, обычно требуется повторение элементов, уже существующих в вашем коде, таких как имена параметров в приведенном выше примере. Если вы изменяете параметр в сигнатуре функции, не забудьте также изменить тег JSDoc.

Новое предложение синтаксиса может быть функционально эквивалентно docblocks, но предлагает гораздо более рациональный опыт. Типы располагаются рядом со своими целевыми объектами как часть вашего исходного кода, а не в блоке документов, который вам нужно создавать и поддерживать отдельно.

Что дальше?

Команда Microsoft TypeScript и соавторы, включая Bloomberg, Igwalia и несколько независимых участников, представили предложение Этапа 0 на пленарном заседании TC39 в марте 2022 года. С тех пор предложение перешло в стадию 1. Однако до принятия еще далеко, а реализация внутри движков потенциально не появится в течение «годов».

Главной целью этого предложения является сбалансировать длинный хвост нетипизированного кода JavaScript с текущим спросом на более статически типизированный опыт разработки. Использование стертого полностью необязательного синтаксиса гарантирует обратную совместимость, но повышает вероятность того, что он будет неэффективен для поощрения внедрения и консолидации экосистемы. Дебаты вокруг этого, похоже, будут расти с новыми мнениями и точками зрения по мере того, как предложение продвигается по треку стандартов.




Все права защищены. © Linux-Console.net • 2019-2024