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

В ранней сети JavaScript было мало. Требование богатого взаимодействия с пользователем не имело смысла для статических веб-страниц. След JavaScript часто затмевался CSS и изображениями. В последние годы этот спрос на богатые интерфейсы на стороне клиента увеличился в геометрической прогрессии. Можно с уверенностью предположить, что JavaScript — это язык программирования для Интернета.

Но по мере того, как кодовая база растет, а количество участников усложняет ее, может ли система типов обрести смысл? По мере увеличения количества ошибок и сложности качество кода становится основным фактором, определяющим скорость, с которой команда может работать.

Что такое система типов?

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

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

Система типов очень похожа на мини-юнит-тест. Система проверки типов позволяет программисту узнать, проходит тест или нет. Это освобождает исходного автора от необходимости указывать намерение типа в реальном модульном тесте.

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

Почему это имеет значение?

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

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

Системы шрифтов создают архитектуру, необходимую для передачи намерений и четкого дизайна. Красота заключается в коде, построенном на основе строгих моделей данных, отвечающих требованиям бизнеса.

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

Эмпирические данные свидетельствуют о уменьшении количества ошибок на 15% за счет добавления системы типов. Так что, когда вы сталкиваетесь с большим проектом JavaScript корпоративного уровня, рекомендуется иметь его, поскольку это эффективный способ повысить качество кода и ускорить его доставку.

Тип Проверки безопасности

Время кода. Давайте продемонстрируем систему типов, используя React PropTypes без React. Чтобы проиллюстрировать проблему, я придумаю ошибку, которая может случиться с каждым. Скажем, у нас есть компонент для сложения двух чисел. Из-за изменений в команде первоначальный замысел компонента забывается. Динамическая типизация может создать племенные знания о контрактах данных, которые превращаются в миф.

Например:

const props = {
  x: 1,
  y: '1'
};
function addNumbersComponent(props) {
  return props.x + props.y;
}
addNumbersComponent(props);

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

Чтобы подавить это поведение, можно сделать:

const propTypes = {
  x: PropTypes.number,
  y: PropTypes.number
};
PropTypes.checkPropTypes(propTypes, props, 'props', 'addNumbersComponent');

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

Это сообщение, которое вы видите, когда появляется предупреждение типа:

В этом отзыве есть ценность, поскольку он автоматизирует проверку типов. В программировании задача часто заключается в максимально возможной автоматизации, включая проверку типов. Цикл обратной связи может быть короче, если проверка типов является частью сборки. Обратите внимание, что это предупреждение не отображается в производственной сборке. Рассмотрите возможность добавления проверки типов как части модульных тестов, чтобы не выполнить сборку.

Не стесняйтесь экспериментировать с примером кода, он вышел на CodePen.

Вывод

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

Поскольку базы кода JavaScript растут как по размеру, так и по сложности, проверка типов имеет большое значение. Хорошая система типов строится поверх нативных типов JavaScript и выполняет базовую проверку типов.

Рассмотрите возможность добавления проверки типов как части сборки, чтобы сократить цикл обратной связи. Чем меньше времени требуется для получения обратной связи, тем быстрее вы сможете предотвратить ошибки.

Первоначально опубликовано на blog.jscrambler.com.