Модернизация устаревшего синтаксиса Flow
Синтаксис Flow со временем претерпел значительные изменения, при этом многие формы приблизились к вариантам написания, совместимым с TypeScript. Многие служебные типы с префиксом $ были переименованы, некоторые были полностью удалены, а некоторые устаревшие синтаксические конструкции получили современные эквиваленты в виде ключевых слов. Эта страница является каноническим справочником по замене устаревших форм современными аналогами.
Эти формы делятся на три группы:
- Удалённые — Flow больше не распознаёт их, и их необходимо переписать.
- Устаревшие — существует современный эквивалент, и команда Flow намерена удалить устаревшую форму в будущем. Выполните миграцию сейчас — это проще и выгоднее, чем миграция позже.
- Не рекомендуемые к использованию — всё ещё распознаются средством проверки типов, но в новом коде этой формы следует избегать.
Удалённые
Flow больше не распознаёт их.
| Устаревший Flow | Современный эквивалент | Удалено в версии |
|---|---|---|
$Diff<A, B> |
Обычно Omit<A, keyof B> или реструктуризация. Не всегда семантически идентично — рассматривайте каждый случай отдельно. |
0.268.0 |
$Rest<A, B> |
Тот же статус, что и у $Diff. Обычно можно заменить на Omit + spread. |
0.267.0 |
$PropertyType<T, K> |
T[K] (доступ по индексу). |
0.266.0 |
$ElementType<T, K> |
T[K] (доступ по индексу). |
0.266.0 |
$TupleMap<T, F> |
Отображённый тип (Mapped type) со встроенным телом F — например, $TupleMap<T, <V>(V) => Promise<V>> становится {[K in keyof T]: Promise<T[K]>}. |
0.248.0 |
$TupleMapi<T, F> |
Отображённый тип (Mapped type) с доступом по ключу и встроенным F — например, {[K in keyof T]: [K, T[K]]}. |
0.248.0 |
Функции-предикаты %checks |
Защитники типов (Type guards) — например, function isString(x: unknown): boolean %checks становится function isString(x: unknown): x is string. |
0.248.0 |
$Call<F, ...Args> |
ReturnType<F> плюс доступ по индексу или условный тип с infer. |
0.247.0 |
$ObjMap<O, F> |
Отображённый тип (Mapped type) со встроенным F — например, $ObjMap<O, <V>(V) => Promise<V>> становится {[K in keyof O]: Promise<O[K]>}. |
0.246.0 |
$ObjMapi<O, F> |
Отображённый тип (Mapped type) с доступом по ключу и встроенным F — например, {[K in keyof O]: [K, O[K]]}. |
0.246.0 |
React.Element<typeof Foo> |
Отдавайте предпочтение типам рендеринга (render types) при описании ограничений композиции («Menu рендерит только элементы MenuItem») — именно это в большинстве случаев выражало использование React.Element<typeof Foo>. Для общих позиций «любой элемент / любой узел» используйте React.MixedElement / React.Node. Обращайтесь к ExactReactElement_DEPRECATED<typeof Foo> только как к крайнему средству, когда действительно требуется точная идентичность элемента. |
0.245.0 |
$Shape<T> |
Partial<T>. Не всегда семантически идентично — $Shape допускал вложенность так, как не допускает Partial, поэтому выполняйте миграцию в каждом месте использования отдельно, а не просто переименовывайте вслепую. |
0.206.0 |
$Partial<T> |
Partial<T>. |
0.203.0 |
Устаревшие
Существует современный эквивалент. Некоторые формы уже сейчас приводят к ошибкам; другие всё ещё разбираются парсером, но находятся в процессе вывода из эксплуатации.
Служебные типы
| Устаревший Flow | Современный Flow | Включено по умолчанию начиная с версии |
|---|---|---|
$Keys<T> |
keyof T |
0.290 |
$ReadOnly<T> |
Readonly<T> |
0.290 |
$NonMaybeType<T> |
NonNullable<T> |
0.290 |
$ReadOnlyArray<T> |
ReadonlyArray<T> |
0.290 |
$ReadOnlyMap<K, V> / $ReadOnlySet<T> / $ReadOnlyWeakMap<K, V> / $ReadOnlyWeakSet<T>
|
ReadonlyMap / ReadonlySet / ReadonlyWeakMap / ReadonlyWeakSet
|
0.290 |
$Values<T> |
Values<T> (переименовано в составе собственных служебных типов Flow) |
0.290 |
mixed |
unknown |
0.290 |
Синтаксические конструкции (не служебные типы)
| Устаревший Flow | Современный Flow | Включено по умолчанию начиная с версии |
|---|---|---|
Приведение типов (x: T) |
x as T |
0.229 |
<T: Bound> |
<T extends Bound> |
0.302 |
Точные типы {| a: number |} |
{a: number} (точный тип по умолчанию) |
0.202 |
Символы вариативности свойств +foo / -foo |
readonly foo / ключевые слова writeonly foo (writeonly специфично для Flow) |
0.315 |
Символы вариативности параметров типа +T / -T |
Ключевые слова out T / in T |
0.315 |
Не рекомендуемые к использованию
Эта форма всё ещё распознаётся средством проверки типов и не вызывает ошибок, однако в новом коде её следует избегать.
| Тип | Рекомендуемый подход |
|---|---|
$Exact<T> |
Сначала определите точный тип, а затем создавайте неточные варианты на его основе с помощью spread-оператора для типов объектов ({...Exact, ...}). См. $Exact<T> (Не рекомендуется). |
Служебные типы с префиксом $, не являющиеся устаревшими
Некоторые типы с префиксом $ остаются полноценными служебными типами Flow — префикс $ является просто частью имени, а не признаком устаревания. Они узкоспециализированы и встречаются редко, но если вы с ними столкнётесь, продолжайте их использовать. Примеры включают $KeyMirror<O> и $Exports<...>. Актуальный список см. в разделе Служебные типы (Utility Types).
См. также
- Flow для пользователей TypeScript — более широкое сравнение Flow и TypeScript, включая согласованное с TS подмножество переименований, рассмотренных здесь.
- Служебные типы — справочник по текущим служебным типам Flow.
-
Отображённые типы (Mapped Types) — современная замена для
$ObjMap/$TupleMapи аналогичных конструкций. -
Приведение типов — синтаксис приведения типов
as, заменяющий(x: T). -
Типы с доступом по индексу (Indexed Access Types) — форма
T[K], заменяющая$PropertyType/$ElementType. -
Устаревшие и удалённые параметры
.flowconfig— часть этих миграций, относящаяся к[options], включаяcasting_syntaxиexact_by_default, с указанием версии, в которой произошли изменения.
© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/modernizing-legacy-syntax