Spec-Zone.ru › Flow

Строгий режим 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 или ложным.

Полный список доступных правил линтера см. в справочнике правил линтера.

Кроме того, обратите внимание: параметры функции считаются константами (то есть обрабатываются так, как если бы они были объявлены с помощью const, а не let). В строгом режиме Flow эту возможность пока нельзя настроить; она всегда включена.

Включение строгого режима Flow в .flowconfig​

Строгий режим Flow настраивается в каждом .flowconfig. Чтобы включить его:

  1. Добавьте раздел [strict] в .flowconfig.
  2. Перечислите правила линтера, которые нужно включить. Настоятельно рекомендуем использовать следующие:
[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 по умолчанию, если они окажутся успешными и получат широкое распространение.

См. также​

  • Линтинг — инфраструктура линтинга Flow для выявления дополнительных проблем
  • Справочник правил линтера — все правила линтера, многие из которых применяются в строгом режиме

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/strict

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API