Search
Write a publication
Pull to refresh

Comments 14

и ни слова про object literal mapping?
enum очень уродливый сам по себе, плюс не спасает от ситуаций типа

ProfessionAction[5]

даже если там всего два значения
Надо писать
const ProfessionAction = {
doctor: "treat",
teacher: "teach"
} as const
type ProfessionActionProps = keyof typeof ProfessionAction


или наоборот если уж очень хочеться

Всё же что-то упустил. Спасибо за дополнение.

enum очень уродливый сам по себе

Сразу видно, человек не писал на C/C++/C#/Java.

Казалось бы, зачем это, если enum позволяет тупо все перечислить, и короче выглядит, и то, и се.

А за чисто JS-ный прикол спасибо.

Вот как раз на этих языках он реализован нормально, а в JS/TS это огрызок. Да ещё и неявное создание другого объекта под капотом. Значение enum будет являться строгим строковым литералом, а значит ни одно сравнение с переменным вида string работать не будут - потребуется явное приведение в месте использования.

Я и говорю, что enum намного привычнее всяких объектов чисто по синтаксису, я не говорил про реализацию конкретно в жс/тс, C/C++/C#/чашке кофе, а тем более, я НЕ говорил про то, что реализация в тс якобы лучше чем бекенд языках

Вам стоит посмотреть, во что вырождается данная конструкция после компиляции tsc. As const подход дает меньше накладных расходов (т.к. после компиляции это будет просто объект) и также это путь к будущей node, с нативным исполнением ts (концепт стирания всех ts аннотаций)

А что нужно?

Для человека, с бекграундом строгого языка, который выражает семантику синтаксисом, где не объявленная переменная приводит к ошибке компиляции, C++, JS выглядит недоделанным языком, а TS его доделывает и делает удобнее C++. И со мной согласятся те, кто писал на C#, Java, Kotlin, ...

Про const enum не все так просто, он не сгенерирует типы и не будет никакого объекта, это compile time структура, есть отдельный раздел с нюансами в документации

Мне вот тоже более интересен практический момент. По опыту, использование enum всегда менее удобно. В основном из-за вот этой ситуации:

enum Actions {
  teacher = 'teach',
  doctor = 'treat'
}

interface MyInterface {
  currentAction: AnotherActions
}

interface MyAnotherInterface {
  currentAction: Actions
}

const actions = {
  teacher: 'teach',
  doctor: 'treat'
} as const

type Role = keyof typeof actions

type AnotherActions = (typeof actions)[Role]

const a = {
  currentAction: 'teach'
} satisfies MyAnotherInterface // Type '"teach"' is not assignable to type 'Actions'.(2322)

const b = {
  currentAction: 'teach'
} satisfies MyInterface // Ok

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

При этом проблемы с перебором одинаковые

for (let [key, value] of Object.entries(ProfessionAction)) {
  console.log(key, value)
  ProfessionAction[key] // Element implicitly has an 'any' type because expression of type 'string' can't be used to index type
}

Автор дилетант. Не знает о чём писать. Изложил кучу несущественных и ненужных деталей, и ни слова о философии и относительной полезности енумов. Ну и вообще в ts/js это притянутая за уши бесполезная конструкция, вероятно замануха для сишников/плюсников. А то, что автор полный профан и шарлатан, очевидно с первых его строк, где он с умным, но невменяемым видом самозабвенно прикручивает дополнительную семантику значениям енумов.

Будет здорово, если раскроете свою мысль.

А вообще, раз разработчики TypeScript добавили эту функцию, то наверное считали её важной. Иначе не стали бы добавлять enum в свой язык.

Это ошибка допущена вначале и сейчас не избавиться так легко. Также как и namespace.

У TypeScript цель быть легко превращённым в JS убирая типы и поэтому не вводится никаких новых синтаксических конструкций.

Исторически сделали , признали ошибку и больше так не делают.

С введением node поддержки кода с типами без проверки, скорее всего, будет постепенный отказ от enum.

erasable syntax : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-8.html#the---erasablesyntaxonly-option

Sign up to leave a comment.

Articles