Как перейти на синтаксис типа объекта с точным по умолчанию

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

Приведение вашей кодовой базы к точному по умолчанию синтаксис состоит из трех фаз:

  1. Обновление инструментов разработчика. Убедитесь, что все ваши инструменты поддерживают новый синтаксис.
  2. Изменение кода. Обновите свою кодовую базу, чтобы использовать новый синтаксис.
  3. Обновление зависимостей. Обновите все зависимости кода, чтобы использовать новый синтаксис.

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

Обновление зависимостей Dev

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

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

  1. Расход ›= 0,84,0 (рекомендуется 0,112,0+)
  2. Babel / Babel Parser / Babel Generator ›= 7.1.5 (рекомендуется 7.4.5+)
  3. Красивее ›= 1,15 (рекомендовать самые свежие)
  4. babel-eslint ›= v11-beta

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

Codemodding

Цель: иметь возможность включить implicit-inexact-object=error в вашем flowconfig, не получая никаких ошибок

После того, как репозиторий настроен для синтаксического анализа новых неявных неточных типов объектов, вы можете приступить к изменению кода вашего кодовая база. Перед включением точного значения по умолчанию необходимо убедиться, что каждый тип объекта в вашей кодовой базе либо явно точный {||}, либо явно неточный {...}. Таким образом, вы можете включить точное значение по умолчанию, не получая никаких новых ошибок.

Есть два способа изменить код вашей базы кода:

  1. Используйте поток-апгрейд. Это попытается обновить всю вашу кодовую базу сразу. Вы можете вызвать flow-upgrade 0.83.0 <YOUR CURRENT VERSION> для запуска codemod.
  2. Используйте jscodeshift напрямую. По нашему опыту, это проще использовать для больших кодовых баз, когда вы не хотите запускать codemod для всей кодовой базы за один раз. Вы можете использовать jscodeshift -t /path/to/transform.js TARGET_DIR для запуска codemod. Получите трансформацию в этой сути.

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

подсказки

  • Если у вас есть файлы, совместно используемые разными репозиториями, добавьте // flowlint ambiguous-object-type:error в начало этих файлов. Это гарантирует, что все типы объектов будут явно точными {||} или явно неточными {...} независимо от настроек по умолчанию. Это гарантирует, что ваши общие файлы всегда будут означать одно и то же в ваших репозиториях, даже если они имеют разные настройки по умолчанию.

Обновление определений библиотеки

Все потоковые типы были обновлены для использования синтаксиса, совместимого с точным по умолчанию. Любое определение типа потока, предназначенное для потока 0.104+, будет использовать только явные точные типы объектов {||} или явные неточные типы объектов {...}.

Завершение codemods

Как только вы сможете включить implicit-inexact-object=error в разделе [lints] в вашей конфигурации flow, не получая никаких ошибок, вы должны перейти к следующему разделу. Убедитесь, что вы отправили это изменение в flowconfig, чтобы другие соавторы не продолжали вводить новые неявные неточные типы объектов.

Обновление зависимостей

Цель: иметь возможность включать точное значение по умолчанию без каких-либо ошибок

Некоторые из ваших зависимостей могут поставляться с собственными .js.flow файлами и не иметь определений с потоковым типом. Эти проекты могут не использовать по умолчанию точно, поэтому в таких случаях у вас есть два варианта:

  1. Добавьте // flowlint ambiguous-object-type:error ко всем типам экспортируемых объектов в этих файлах и передайте изменения.
  2. Сделайте определения в виде потока и используйте там // flowlint ambiguous-object-type:error.

Оба варианта также упростят другим участникам сообщества обновление собственных кодовых баз.

Чтобы найти зависимости, в которых возникают эти проблемы, включите exact_by_default=true в разделе options вашего flowconfig. Если у вас нет ошибок, значит, вы уже готовы к работе. В противном случае просмотрите сообщения, чтобы увидеть, какие пакеты указаны в node_modules справочнике по ошибкам.

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

Заключение

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