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

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

Что делает ошибку?

Система типов Flow является структурной и позволяет делать тщательный вывод типов. Оба эти свойства затрудняют написание хороших сообщений об ошибках.

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

function myFunction(o: {foo: {bar: Array<string>}}) {
  // ...
}
const bar = [1, 2, 3];
myFunction({foo: {bar}});

В этом примере вызов myFunction неверен. Элементы числового массива несовместимы с ожидаемым типом массива string свойства bar свойства foo. Мы не можем просто указывать на числа и string тип. Тогда мы не сможем указать на истинный источник ошибки. Звонок myFunction.

Flow определяет типы, читая ваш код. Если вы сделаете ошибку, Flow может неверно истолковать ваше намерение и вывести другие типы, чем вы ожидаете. Добавление аннотаций типов - отличный способ сообщить Flow, чего вы ожидаете. Тогда Flow сможет лучше отображать сообщения об ошибках, объясняя, почему ваш код не соответствует вашим ожиданиям.

Каждое сообщение об ошибке будет указывать на «корневое» местоположение (выделено красным) и некоторое количество ссылочных местоположений (выделено синим). Эти ссылки можно превратить в гиперссылки в среде IDE.

Что еще изменилось в сообщениях об ошибках?

  • Когда тип объединения или тип пересечения несовместим, вместо отображения каждой ветви (как раньше в Flow) для каждой ветви будет рассчитываться «оценка», и будут показаны только ветви с наивысшими оценками. Это имеет большое значение для пользователей Redux с большими типами объединений для действий. Используйте флаг --show-all-branches, чтобы отключить это поведение.
  • Исправлены места для множества сообщений, в которых не указывалось на источник ошибки.
  • Многие несвязанные места в типах библиотек больше не включаются в вывод сообщения об ошибке. Важно отметить, что это означает, что комментарии подавления ($FlowFixMe), которые могли подавлять сообщения об ошибках для каждого использования функции или компонента, больше невозможны.

IDE

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

В то время как IDE продолжат работать со своими текущими плагинами Flow, теперь IDE могут использовать вывод в формате RTF с помощью Flow и обеспечивать еще лучший пользовательский интерфейс!

Передача флага --json-version=2 в Flow даст вам новый формат сообщения об ошибке, закодированный в подмножестве уценки (документация).

использованная литература

  • Эльм первым изобрел Ошибки компилятора для людей, которые, безусловно, послужили источником вдохновения для этой работы.
  • Несколько недель назад был выпущен Glow, обеспечивающий улучшенный рендерер CLI для старого формата сообщений об ошибках Flow.
  • Reason также значительно улучшил сообщения об ошибках, возвращаемые OCaml своим пользователям.

В Flow 0.66 внесено еще несколько интересных изменений в среде IDE. Полный список изменений можно найти на GitHub.

Вы видите сообщение об ошибке, которое вам действительно нравится в ваших проектах? Мы хотим это увидеть! Отправьте твит на @flowtype, и мы включим ваше сообщение об ошибке в это сообщение блога.