BonBonSlick
@BonBonSlick
Junior Web Developer Trainee

Когда исопльзовать Enum, а когда Union?

https://stackoverflow.com/questions/18111657/how-t...
https://stackoverflow.com/questions/40275832/types...

export enum SocialAuthService {
    FACEBOOK = 'facebook',
    GOOGLE   = 'google',
}

type SocialAuthServiceType =
    | SocialAuthService.FACEBOOK
    | SocialAuthService.GOOGLE
    ;

someFunc(service: SocialAuthServiceType){
..
}

Playground

Можно получить идентичный функционал испльзуя и те и другие возможности языка (енам и юнион).
В СО описаны так же и другие подходы enum к примеру
const Permission = {
  Read: 'r',
  Write: 'w',
  Execute: 'x'
} as const;

Из чего следует вопрос, какой тогда подход лучше и почему?
Использовать enum или type? Если enum, то какой подход лучше, классом или enum?

Когда и как правильно, почему так?
Когда использовать union и когда enum?
  • Вопрос задан
  • 56 просмотров
Решения вопроса 3
Aetae
@Aetae
Тлен
Юнион когда нужен только тип, енум - когда нужны ещё и рантайм значения. Очевидно же. Константный объект тупо не так удобен как enum, смысла в нём нет для этого класса задач.

Вообще, строго говоря, enum надо юзать тогда, когда нужен enum. Л - логика. Enum - Enumeration - Перечисление. Есть перечисление - юзай enum.
Ответ написан
sarapinit
@sarapinit
Точу водой камень
Я бы сказал так: не используйте UNION пока явно не понадобится UNION. А это только в случае объединения типов с разной структурой. Если у вас однотипные значения, то используйте enum. К тому же для компилятора проверки корректности для type тяжелее чем для enum.
Ответ написан
bingo347
@bingo347
Ищу Java и TypeScript разработчиков
Как уже верно заметил Aetae, юнион - это только тип, а enum - это и тип и значение одновременно.

Для внешних значений (конфигурации, UI, API) - лучше использовать юнион из возможных значений, а так же валидацию, что ничего левого не пришло.

Для внутренних значений - const enum, так в рантайме будут простые легковесные числа, а в исходниках понятные константы.

Обычный enum - только для внешних интерфейсов библиотек общего пользования, ибо на выходе там обычный объект, который можно будет использовать без typescript.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы