Enums Typescript - PullRequest
       3

Enums Typescript

0 голосов
/ 10 января 2019

Я понимаю, что этот вопрос задавался миллиард раз, но я до сих пор не могу понять, как работают перечисления.
Например, я получил простой enum

export enum Type { 
  Null,
  First, 
  Second,
  Third
}

Теперь вопрос, в чем разница между этими кодами

if (myObject.type === 2) doStuff();

А вот этот:

if (myObject.type === Type.Second) doStuff();

Я получаю myObject из бэкэнда, и мне нужно определить этот тип объекта для запуска какой-либо функции, почему я должен делать это с перечислениями типа
Может быть, я ошибаюсь, но мои примеры делают то же самое
Не могли бы вы объяснить, почему я должен использовать тип enums в моем примере

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Вы правы, что в простом Javascript они делают то же самое. TypeScript дает вам дополнительную безопасность на случай, если ваш код изменится в будущем.

Представьте, что в какой-то момент вы добавляете новый элемент в ваше перечисление. Возможно, нулевой элемент между нулем и первым. Теперь Type.Second будет равен 3, и ваша проверка на === 2 больше не будет правильной. Используя перечисление последовательно, вы можете избежать этих будущих ошибок.

0 голосов
/ 10 января 2019

Стоит взглянуть на скомпилированный javascript вашего перечисления в машинописи:

export enum Type { 
  Null,
  First, 
  Second,
  Third
}

Компилируется примерно в:

var Type = {};
Type[Type["Null"] = 0] = "Null";
Type[Type["First"] = 1] = "First";
Type[Type["Second"] = 2] = "Second";
Type[Type["Third"] = 3] = "Third";

Попробуйте на детской площадке

Итак, совершенно очевидно, что Type.Second даст число 2, а Type[2] вернет "Second".

Не могли бы вы объяснить мне, почему я должен использовать тип enums в моем примере?

Некоторые из распространенных причин:

  1. более читабельно
  2. Вы не сломаете свой код, если кто-то изменит enum:

export enum Type { 
    Null,
    First, 
    Second = 3, /// now it's 3
    Third
}

export enum Type { 
    Undefined, /// This is 0
    Null, /// 1
    First, /// 2
    Second, /// 3
    Third
}
  1. Таким образом, ваш код становится более надежным и поддерживаемым
0 голосов
/ 10 января 2019

Два куска кода похожи в том, что они делают. Type.Second будет содержать номер, связанный с членом перечисления, а type (при условии, что он набран как Type) должен содержать член перечисления и, следовательно, должен быть числом во время выполнения. Это означает, что в обоих случаях вы сравниваете числа, просто во втором случае значение является встроенным, а в первом - из-за доступа к элементу объекта.

Теперь с сервера вы не возвращаете числа, но возвращаете имя перечисления, ни один из них не будет работать должным образом.

Также обратите внимание, что, хотя это и не очень хорошая идея, вы можете изменить значения времени выполнения объекта enum, что может привести к неожиданным результатам:

 (Type as any)["Second"] = 10

Если вы хотите, чтобы они были одинаковыми (т. Е. Скомпилированный код одинаков в обоих случаях), вы можете использовать const enum. const enums не используйте объект времени выполнения, все ссылки на memeer заменяются фактическим значением перечисления:

export const enum Type { 
  Null,
  First, 
  Second,
  Third
}

if (myObject.type === Type.Second) doStuff();
// Compiled to 

if (myObject.type === 2 /* Second */)
    doStuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...