yomoyo icon indicating copy to clipboard operation
yomoyo copied to clipboard

[intensive] [js3] спорный словарь const Type вместо enum

Open big-duke opened this issue 2 years ago • 1 comments

Ссылка https://up.htmlacademy.ru/react/11/demos/9617#10

Проблема, вопрос, предложение Файл data.js

Мне кажется спорным вариант создания объекта с именем Type (const Type). Сюда же просится enum.

Возможное решение

enum ProductStatus= {
  SALE =  'Сейл',
  NEW =  'Нью',
};

big-duke avatar Nov 06 '22 12:11 big-duke

Я не могу посмотреть демку, поэтому недопонимаю как сейчас. Но сами enumы, по моему мнению, мусор и антипаттерн TypeScriptа.

Точнее это не только моё мнение, у евангелиста TypeScriptа @mattpocock было хорошее видео по этому поводу: Хорошее видео

То есть, если у нас нет какого-то синтетического теста, которому подойдут только enumы, то во всех реальных задачах вместо enumов можно использовать что-то другое:

  1. Нам нужны статус коды виде чисел, но чтобы при разработке были читаемые имена, и при этом мы контролируем среду исполнение (компилятор)? Наш выбор const enum
  2. Нам нужно просто захардкодить несколько строк в качестве возможных значений? Ну тогда обычный Union Type покрывает все наши потребности:
    type ProductStatus =  'Сейл' | 'Нью';
    
  3. Нам нужно итерироваться по значением зачем-то (например, чтобы сгенирировать документацию). Ну тогда можно сделать либо массив, либо объект as const
    // const array example
    const PRODUCT_STATUSES = ['Сейл', 'Нью'] as const;
    
    type ProductStatus = typeof PRODUCT_STATUSES[number];
    // ^ аналогично `type ProductStatus = "Сейл" | "Нью"`
    
    // const object example
    const ProductStatus = {
      SALE:  'Сейл',
      NEW: 'Нью',
    } as const;
    
    type ProductStatusKey = keyof typeof ProductStatus; // "SALE" | "NEW"
    type ProductStatusValue = typeof ProductStatus[ProductStatusKey];  // "Сейл" | "Нью"
    

И все из них проще и понятнее чем обычные enumы. Рассказывать студентам что сами enumы существует стоит, но лучше советовать их не использовать.

baileys-li avatar Apr 05 '23 14:04 baileys-li