Переход с устаревших шаблонов
Узнайте, как перейти на 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