Строгий Flow
Вы можете включить более сильные гарантии безопасности в Flow (например, запретить типы any/Object/Function и потребовать типизацию всех зависимостей) добавив @flow strict в ваши файлы.
Обзор
Flow был разработан для простоты использования, поэтому он позволяет отказаться от проверки типов в определённых ситуациях, разрешая небезопасные действия. Но поскольку во многих базах кода сейчас широко используются типы Flow, этот компромисс можно изменить. Вы можете использовать Строгий Flow, чтобы запретить ранее разрешённые небезопасные шаблоны. Это даёт вам улучшенные гарантии безопасности, которые позволяют поймать больше ошибок и упростить рефакторинг. И вы можете постепенно реализовать эти более сильные гарантии, по файлам.
Функции
Включение Строгого Flow для файла означает, что несколько ранее разрешённых шаблонов теперь будут вызывать ошибку Flow. Каждый запрещённый шаблон имеет соответствующее правило Flow Lint, которое вызывает ошибку. Список правил, включённых для @flow strict , настраивается в каждом .flowconfig. Вот рекомендуемые правила:
-
nonstrict-import: Вызывает ошибку при импорте из модуля, который также не@flow strict. Это очень важно, потому что это означает, что когда файл помечен как строгий, все его зависимости также являются строгими. -
unclear-type: Вызывает ошибку при использованииObject,Function, илиanyв аннотации типа. -
untyped-import: Вызывает ошибку при импорте из нетипизированного модуля. -
untyped-type-import: Вызывает ошибку при импорте типа из нетипизированного модуля. -
unsafe-getters-setters: Вызывает ошибку при использовании геттеров и сеттеров, которые могут быть небезопасными. -
sketchy-null: Вызывает ошибку при проверке существования значения, которое может быть null/undefined или ложным.
Полный список доступных правил lint см. в Справочнике правил Lint.
Кроме того, обратите внимание, что параметры функций считаются const (т.е. обрабатываются так, как будто они были объявлены с const а не с let). Эта функция пока не настраивается в Строгом Flow; она всегда включена.
Включение Строгого Flow в .flowconfig
Строгий Flow настраивается в каждом .flowconfig. Для включения:
- Добавьте раздел
[strict]в.flowconfig. - Перечислите правила lint для включения. Это настоятельно рекомендуется:
[strict] nonstrict-import unclear-type unsafe-getters-setters untyped-import untyped-type-import
Также рекомендуется, но необязательно, так как может быть слишком шумным в некоторых базах кода:
sketchy-null
Мы рекомендуем включить все желаемые правила с самого начала, а затем применять Строгий Flow по файлам. Это работает лучше, чем включение одного правила, добавление @flow strict во многие файлы, а затем добавление других правил в конфигурацию.
Внедрение
Добавьте @flow strict в файл и исправьте все появившиеся ошибки. Поскольку Строгий Flow требует, чтобы зависимости также были строгими (если включено правило nonstrict-import), начните с листьев дерева зависимостей и работайте вверх по нему. Не добавляйте $FlowFixMe для подавления новых ошибок по мере их появления; просто добавьте @flow strict после того, как все проблемы будут решены. Поскольку самые распространённые причины использования $FlowFixMe связаны с зависимостью от нетипизированных зависимостей или поведения, будущие проблемы значительно уменьшатся после включения Строгого Flow.
Будьте либеральны при включении Строгого Flow. В отличие от добавления или удаления @flow, добавление или удаление @flow strict (само по себе) не изменяет покрытие Flow. Оно только предотвращает или разрешает добавление определённых новых небезопасных действий в будущем. Даже если в будущем Строгий Flow придётся отключить для файла, по крайней мере, небезопасное поведение не будет добавлено в это время.
Определения библиотек считаются строгими (так как они могут быть включены во многие разные проекты с противоречивыми конфигурациями строгих параметров).
Строгий локально
Если вы включите правило nonstrict-import в своей конфигурации Строгого Flow (рекомендуется), то все зависимости строгих файлов также должны быть строгими. Хотя это оптимальная цель, для больших существующих баз кода может быть полезно использовать некоторые преимущества Строгого Flow до того, как все зависимости станут строгими.
@flow strict-local — это то же, что и @flow strict, но не требует, чтобы его зависимости также были строгими (т. е. это «локально» строго). У него нет отдельной конфигурации: он использует ту же конфигурацию, что и Строгий Flow, только без правила nonstrict-import.
После того, как все зависимости файла @flow strict-local станут строгими, файл можно модернизировать до файла @flow strict. Файл @flow strict не может зависеть от файла @flow strict-local, так как это нарушит правило nonstrict-import.
Что впереди
В конечном итоге некоторые функции Строгого Flow могут стать стандартным поведением Flow, если эти функции окажутся успешными и будут широко приняты.
© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/strict