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 работать не будут - потребуется явное приведение в месте использования.
Вам стоит посмотреть, во что вырождается данная конструкция после компиляции tsc. As const подход дает меньше накладных расходов (т.к. после компиляции это будет просто объект) и также это путь к будущей node, с нативным исполнением ts (концепт стирания всех ts аннотаций)
TypeScript вообще не нужен
Про 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
Для чего нужны enum в TypeScript. Подробно и простым языком