Flow — средство проверки статического типа для JavaScript


Если ваше самое большое возражение против JavaScript заключается в том, что он динамически типизирован, то Flow from Facebook может быть именно тем, что вы ищете.

Flow — это средство проверки статического типа с открытым исходным кодом для JavaScript. Конечно, в динамическом языке нет статического типа для любой переменной. Что делает Flow, так это использование вывода типа. Другими словами, если вы присваиваете строку переменной, то ее тип — строка.

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

Однако Flow делает все возможное, чтобы определить тип любой переменной и пометить найденные ошибки. Вам не нужно вводить проверку всей программы, поскольку программа Flow будет проверять только файлы, которые начинаются с / * @ flow * /.

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

Например, если у вас есть программа

тогда Flow заметит, что входной параметр x должен быть числом, чтобы вызов работал, и сгенерирует:

hello.js: 5: 5,19: строка

Этот тип несовместим с

hello.js: 3: 10,15: число

Проблема в том, что подобный тип вывода быстро начинает сталкиваться с трудностями, вызванными неоднозначным кодом. Так что, кроме того, Flow позволяет добавлять аннотации типов. Например:

1

2

3

4

5

/* @поток */

function foo (x: строка, y: число): строка {

вернуть x.length * y;

}

Это упрощает проверку типов, и вы можете сделать вещи более сложными, проверяя не только базовые типы, но и типы вложенных классов. Некоторые способы, которыми Flow использует аннотации типов, выходят за рамки простой иерархии классов, например он пытается учесть свойства, которые динамически добавляются к объектам.

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

Это фактически превращает JavaScript в другой язык. Это подход, используемый другими сценариями Java с проверкой типа, такими как Microsoft TypeScript. Лучше было бы каким-то образом сделать аннотации типов частью комментария, но на сегодняшний день не было изобретено гибкого способа сделать это. Как, например, вы используете комментарии для ввода параметров в функцию?

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

Например, Flow обнаружит нулевое значение и пожалуется, если вы попытаетесь использовать его таким образом, который вызовет ошибку времени выполнения. Однако, если вы добавите оператор if, который проверяет наличие null перед использованием переменной, Flow знает, что код безопасен.

Кажется, что Flow выполняет полезные проверки вашего кода даже без аннотации типа, но в документации есть предупреждение:

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

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

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

Flow используется Facebook в производственных настройках, но это также очень большая работа. Вы можете помочь на GitHub с улучшением кода, и есть планы улучшить его в будущем, добавив:

Поддержка преобразования существующих файлов объявлений TypeScript для общих библиотек на сайте DefinentyTyped.org в объявления Flow.

Поддержка модуля ES6

Компиляция средства проверки потока в JavaScript с использованием js_of_ocaml

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

Интеграция редактора ошибок типа Flow

Команды потока для поддержки IDE, такие как автозаполнение

Категоризация сообщений об ошибках и фильтрация по файлам

Улучшенные ошибки: лучшая атрибуция виноватых и отслеживание ошибок

Множество функций системы типов, таких как ограниченный полиморфизм, перечисления, анализ чистоты функций и многое другое.


Добавить комментарий