Глоссарий
Краткий глоссарий терминологии Flow. Каждая статья содержит определение в одном предложении и ссылку на полную справочную страницу. Если это полезно, в статье также отмечается, как понятие соотносится с похожим понятием в TypeScript.
Система типов
-
Уточнение типа — сужение типа значения внутри ветви на основе проверки во время выполнения, например
typeof,instanceof, проверки на равенство или защитника типа. См. Уточнение типов. - Инвалидация уточнения типа — ситуация, когда ранее установленное уточнение типа сбрасывается, поскольку промежуточный код (например, вызов функции или запись в уточнённое место) мог изменить исходное значение, и проверку нужно выполнить повторно; механизм сужения типов в TypeScript имеет собственную модель инвалидации, которая в деталях отличается от модели Flow (подробнее). См. Инвалидация уточнений типов.
-
Тип Maybe (
?T) — сокращённая запись объединения типовT | null | voidв Flow, используемая для обозначения значений, которые могут отсутствовать; в TypeScript нет прямого аналога, и обычно записываютT | null | undefined(подробнее). См. Типы Maybe. - Точный тип объекта — тип объекта, допускающий только перечисленные свойства и никакие другие; в Flow это поведение используется по умолчанию (в отличие от TypeScript, где типы объектов открыты) (подробнее). См. Точные и неточные типы объектов.
-
Неточный тип объекта — тип объекта с завершающим
...(например,{foo: number, ...}), допускающий дополнительные неизвестные свойства помимо перечисленных; типы объектов TypeScript по умолчанию открыты и не имеют синтаксического маркера неточности (подробнее). См. Точные и неточные типы объектов. -
Разворачивание типа объекта — включение свойств другого типа объекта с помощью
...(например,{...A, b: T}), в результате чего создаётся новый тип объекта, объединяющий свойстваAс дополнительными членами, подобно разворачиванию объектов во время выполнения; в TypeScript нет разворачивания на уровне типов, и вместо него используется пересечение (A & {b: T}) (подробнее). См. Разворачивание типа объекта. -
Индексируемое свойство — член типа объекта вида
[key: K]: V, разрешающий чтение и запись по любому ключу, тип которого соответствуетK, и с любым значением, тип которого соответствуетV; используется для типизации объектов-словарей. См. Объекты-словари. -
Непересекающееся объединение — объединение отдельных типов объектов (например,
{type: 'A', value: number} | {type: 'B', error: string}), каждый из которых задаёт свой литеральный тип для общего свойства-дискриминанта, позволяя Flow уточнить объединение до конкретного варианта при проверке этого свойства. См. Непересекающиеся объединения объектов. -
Непрозрачный тип — псевдоним типа, базовый тип которого скрыт за пределами файла, где он определён, что обеспечивает абстракцию на границах модулей; в TypeScript такого понятия нет, а ближайший пользовательский аналог (брендированные типы) слабее, поскольку одним приведением
asможно создать значение с брендом (подробнее). См. Псевдонимы непрозрачных типов. -
Пустой тип — нижний тип в Flow, подтип любого другого типа; используется для функций, которые ничего не возвращают, и для утверждений о полноте обработки вариантов; аналог в TypeScript называется
never(подробнее). См. Пустой тип. - Подтипизация по ширине — правило, согласно которому тип объекта с большим количеством свойств является подтипом типа с меньшим количеством свойств (в Flow это верно только для неточных типов объектов); это правило гораздо строже, чем в TypeScript, где типы объектов по умолчанию открыты (подробнее). См. Подтипизация объектов.
- Подтипизация по глубине — правило, согласно которому тип объекта, имеющий в некотором свойстве подтип, является подтипом типа, имеющего в этом свойстве супертип; это правило безопасно только для свойств, доступных только для чтения. TypeScript всё равно рассматривает изменяемые свойства ковариантно, тогда как Flow делает их инвариантными (подробнее). См. Подтипизация объектов.
-
Номинальная типизация — совместимость типов определяется идентичностью объявления, а не структурой; Flow использует её для классов, непрозрачных типов (за пределами файла, где они определены) и перечислений Flow. TypeScript в основном использует структурную типизацию, допуская отдельные узкие исключения для номинальной типизации (поля
#private, модификаторыprivate/protected,unique symbol) (подробнее). См. Номинальная и структурная типизация. - Структурная типизация — совместимость типов определяется их структурой; Flow использует её для объектов и интерфейсов. См. Номинальная и структурная типизация.
- Локальный вывод типов — алгоритм вывода типов Flow, распространяющий типы из непосредственного контекста, но требующий аннотаций для параметров функций и других важных границ. См. Требование аннотаций.
-
Односторонний защитник типа (
implies) — функция-предикат с типом возвращаемого значенияimplies param is T, которая уточняет параметр доTтолько при возврате функциейtrue, а в противном случае оставляет его без изменений; в TypeScript аналога нет (подробнее). См. Защитники типов. -
Отвязка метода — Flow запрещает извлекать метод класса как отдельное значение функции (например,
obj.methodбез вызова, деструктуризации или применения.bind()), поскольку при этом теряется типthis, от которого зависит метод; TypeScript рассматривает методы как обычные значения функций и молча разрешает такое извлечение (подробнее). См. Отвязка метода. -
Входная позиция / выходная позиция — термины, используемые в сообщениях об ошибках вариантности Flow для обозначения того, куда значение записывается в тип (вход — параметры функций, свойства, доступные для записи) и откуда оно читается из типа (выход — типы возвращаемых значений, свойства, доступные для чтения). В Flow и TypeScript используется одинаковый синтаксис вариантности —
in T/out Tдля параметров типов,readonly/writeonlyдля свойств, — но правила вариантности Flow в ряде случаев строже (изменяемые свойства, изменяемые массивы, параметры методов, аргументы обобщённых типов) (подробнее). См. Входные и выходные позиции.
Модули и объявления
-
import typeof— специальная для Flow форма импорта, которая импортирует тип экспорта-значения из другого модуля, чтобы его можно было использовать как аннотацию типа; ближайший аналог в TypeScript —typeof import('./m')['Foo'], но с другой формой связывания (подробнее). См. Типы модулей. -
Файл объявлений (
.js.flow) — файл.flow, размещённый рядом с реализацией.jsи полностью подменяющий типы реализации при проверке кода в Flow;.d.tsв TypeScript охватывает как этот случай, так и случай сторонних пакетов, для которых Flow использует определения библиотек (подробнее). См. Файлы объявлений. -
Определение библиотеки (libdef) — специальный файл в
flow-typed/, объявляющий сигнатуры типов стороннего модуля, который Flow не может проверять напрямую; эквивалент в TypeScript — пакеты@types/*и файлы.d.tsна уровне пакета (подробнее). См. Определения библиотек. -
Извлечение сигнатуры / типизированный интерфейс — Flow строит для каждого модуля «типизированный интерфейс», используя только экспорты модуля, без анализа реализации; это позволяет выполнять проверку типов параллельно. Если Flow не может этого сделать, возникает ошибка
[signature-verification-failure]. В TypeScript аналога нет: он выводит типы экспортов на основе тел модулей (подробнее). См. Экспорты модулей.
React
-
Синтаксис компонентов (
component) — встроенное ключевое слово Flow для объявления компонентов React с именованными свойствами, необязательным ref и поддержкой типа рендеринга; заменяет написанные вручную типы функциональных компонентов. В TypeScript нет встроенного синтаксисаcomponent, и аналогичная структура задаётся типами функций (подробнее). См. Синтаксис компонентов. -
Тип компонента (
component(...)) — форма на уровне типов для синтаксиса компонентов, используемая для описания типа компонента React (особенно в определениях библиотек и компонентах высшего порядка), не объявляя сам компонент. См. Типы компонентов. -
Тип рендеринга (
renders) — тип, задающий, что компоненту разрешено рендерить; позволяет авторам библиотек устанавливать правила композиции, например «Menuможет рендерить толькоMenuItem»; в TypeScript нет встроенного типа для ограничения рендеринга (подробнее). См. Типы рендеринга. -
Синтаксис хуков (
hook) — встроенное ключевое слово Flow для объявления хуков React, позволяющее Flow проверять соблюдение правил React в местах вызова хуков; в TypeScript аналога нет, и для проверки правил хуков без информации о типах используется ESLint (eslint-plugin-react-hooks) (подробнее). См. Синтаксис хуков.
Возможности языка
-
Перечисление Flow — фиксированный набор констант, существующий и во время выполнения, и в качестве типа, со встроенной проверкой полноты обработки вариантов и без неявного приведения к базовому примитивному типу; по ряду параметров семантически отличается от
enumв TypeScript (полнота обработки, приведение, значения по умолчанию, обратное отображение, перебор членов, символьные перечисления) (подробнее). См. Перечисления Flow. -
Выражение match / инструкция match — конструкция
match (...) { pattern => ... }, сопоставляющая значение с образцами по структуре, защитниками и проверкой полноты обработки; в TypeScript нетmatch, а ближайший аналог в форме инструкции —switchс различаемыми объединениями иassertNeverв ветке по умолчанию; аналога в форме выражения нет (подробнее). См. Выражения и инструкции match. -
Проверка полноты обработки вариантов — проверка того, что обработано каждое возможное значение входных данных; встроенно поддерживается в
matchи вswitchдля перечислений Flow. Для произвольных инструкцийswitchтакую проверку можно выполнить по требованию, приведя ветку по умолчанию кempty.
Рабочий процесс
-
Директива
@flow— комментарий// @flowв начале файла, который по умолчанию включает проверку типов Flow для этого файла. См. Начало работы. -
Строгий режим Flow (
@flow strict/@flow strict-local) — директива уровня файла, включающая настраиваемый набор более строгих правил линтера (запретanyи т. д.) для отдельного файла; более распространённый вариант@flow strict-localработает так же, но не требует, чтобы зависимости тоже использовали строгий режим. См. Строгий режим Flow. -
Подавление ошибки (
$FlowFixMe[code]) — комментарий, размещённый непосредственно над ошибкой Flow, который скрывает эту конкретную ошибку, не устраняя её причину; используется, когда Flow чрезмерно строг или исправление откладывается. См. Подавление ошибок. -
Flowlint — встроенная система линтинга Flow, которая выявляет стилистические и потенциально опасные конструкции (например,
sketchy-null,untyped-import) в дополнение к обычным ошибкам типов. См. Обзор линтинга.
© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/glossary