Spec-Zone.ru › Flow

Переход с устаревших шаблонов

Узнайте, как перейти на Flow Enums с устаревших шаблонов перечислений JavaScript, например Object.freeze.

Сначала узнайте, как обновить место определения перечисления, а затем — как обновить файлы, которые импортируют и используют перечисление.

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

Object.freeze​

Если вы используете Object.freeze, то можете перейти на перечисление, если значения объекта:

  • Имеют один и тот же примитивный тип, который является boolean, string, number или symbol.
  • Все являются литералами.
  • Не содержат повторяющихся значений.

Замените

const Status = Object.freeze({
  Active: 1,
  Paused: 2,
  Off: 3,
});


export type StatusType = Values<typeof Status>;


export default Status;

на

export default enum Status {
  Active = 1,
  Paused = 2,
  Off = 3,
}
  • Убедитесь, что имена ключей не начинаются со строчных букв от «a» до «z» (в перечислениях это запрещено). Если такие ключи есть, переименуйте элементы.
  • Удалите все случаи использования keyof ... или Values<...> для типа перечисления — они больше не нужны, поскольку Flow Enum сам определяет тип (своё имя).
  • Удалите все экспорты типов, основанные на перечислении: достаточно экспортировать Flow Enum. Flow Enum выступает и как тип, и как значение (подобно классу).

Затем узнайте, как обновить файлы, которые импортируют и используют перечисление.

keyMirror​

Утилита keyMirror создаёт объект, значения которого повторяют имена его ключей. Вместо keyMirror можно использовать перечисление со строковыми значениями.

Замените

import keyMirror from 'keyMirror';

const Status = keyMirror({
  Active: null,
  Paused: null,
  Off: null,
});

export type StatusType = keyof typeof Status;

export default Status;

на

export default enum Status {
  Active,
  Paused,
  Off,
}
  • Убедитесь, что имена ключей не начинаются со строчных букв от «a» до «z» (в перечислениях это запрещено). Если такие ключи есть, переименуйте элементы.
  • Удалите все случаи использования keyof ... для типа перечисления — оно больше не нужно, поскольку Flow Enum сам определяет тип (своё имя).
  • Удалите все экспорты типов, основанные на перечислении: достаточно экспортировать Flow Enum. Flow Enum выступает и как тип, и как значение (подобно классу).

Затем узнайте, как обновить файлы, которые импортируют и используют перечисление.

Обновление использования​

Исправление импортов типов​

В предыдущих шаблонах требовалось экспортировать (а затем импортировать) тип отдельно от самого перечисления. Flow Enums являются и типами, и значениями (подобно классу), поэтому достаточно экспортировать сам Flow Enum. Теперь, когда экспорт только один, нужен только один импорт. Подробнее см. в разделах экспорт перечислений и импорт перечислений.

Если раньше у вас было:

const Status = Object.freeze({
  Active: 1,
  Paused: 2,
  Off: 3,
});
export type StatusType = Values<typeof Status>;
export default Status;

и вы заменили это на:

export default enum Status {
  Active = 1,
  Paused = 2,
  Off = 3,
}

то вам также нужно исправить импорты:

Если импортировались и тип, и значение​

Если вы используете перечисление и раньше импортировали и тип, и значение, удалите импорт типа и обновите используемые аннотации.

Замените

import type {StatusType} from 'status';

import Status from 'status';

const myStatus: StatusType = Status.Active;

на

// Type import is deleted

import Status from 'status';

const myStatus: Status = Status.Active; // Changed type annotation to just `Status`

Если импортировался только тип​

Если вы используете перечисление и раньше импортировали только тип, замените именованный импорт типа на импорт по умолчанию.

Замените

import type {StatusType} from 'status';

function isActive(status: StatusType) { ... }

на

// Remove the braces `{` `}` and changed the name - this is a default import now
import type Status from 'status';

function isActive(status: Status) { ... } // Changed type annotation to just `Status`

Преобразование перечислений в другие значения​

Иногда требуется преобразовать значение перечисления в какое-либо другое значение. Раньше для этого иногда использовали объектные литералы. Для Flow Enums вместо этого используйте функцию с switch. Проверка switch проверяет все возможные случаи, поэтому Flow гарантирует, что вы обновите преобразование при добавлении или удалении элементов Flow Enum.

Замените этот шаблон

enum Status {Active, Paused, Off}
declare const status: Status;


const STATUS_ICON: {[key: Status]: string} = {
  [Status.Active]: 'green-checkmark',
  [Status.Paused]: 'grey-pause',
  [Status.Off]: 'red-x',
};
const icon = STATUS_ICON[status];

на

enum Status {Active, Paused, Off}
declare const status: Status;


function statusIcon(status: Status): string {
  switch (status) {
    case Status.Active:
      return 'green-checkmark';
    case Status.Paused:
      return 'grey-pause';
    case Status.Off:
      return 'red-x';
  }
}
const icon = statusIcon(status);

Подробнее см. в разделе преобразование перечислений в другие значения.

Использование в качестве типа представления (например, строки)​

Нельзя напрямую использовать Flow Enum в качестве его типа представления (например, string). Если Flow сообщает об ошибках при использовании перечисления как его типа представления, сначала попробуйте изменить код так, чтобы он ожидал тип перечисления, а не тип представления (например, замените аннотации string на Status). Если вам действительно нужно использовать перечисление в качестве типа представления, можно добавить явные приведения типов. См. раздел приведение к типу представления.

Приведение к типу перечисления​

Если раньше вы приводили тип представления перечисления (например, string) к типу перечисления примерно так:

function castToStatus(input: number): StatusType | void {
  switch(input) {
    case 1: return Status.Active;
    case 2: return Status.Paused;
    case 3: return Status.Off;
    default: return undefined;
  }
}

castToStatus(x);

теперь можно просто использовать метод cast:

Status.cast(x);

Обновление инструкций switch​

Для Flow Enums выполняется исчерпывающая проверка инструкций switch. Возможно, потребуется обновить код, если вы перебираете значения перечисления в switch. Подробнее см. в разделе исчерпывающая проверка перечислений в инструкциях switch.

Операции с элементами перечисления​

Если раньше вы использовали такие возможности, как Object.values, Object.keys или циклы for-in, чтобы получить элементы перечисления и выполнить над ними операции, вместо этого можно использовать метод members.

См. также​

  • Объединения — шаблон, который во многих случаях заменяют Flow Enums
  • Литеральные типы — строительные блоки на уровне типов для шаблонов перечислений на основе объединений

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/enums/migrating-legacy-patterns

Spec-Zone.ru

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