#javascript #reactjs #typescript #enums #react-typescript
#javascript #reactjs #typescript #перечисления #реагировать -typescript
Вопрос:
Имея следующий исходный код, это функция, которая на основе значения toCheck
создает класс css:
const computeSomething = (toCheck: string) => {
return clsx('flex', {
'flex-start': toCheck === 'FIRST',
'flex-end': toCheck === 'LAST'
});
}
Требование состоит в том, чтобы использовать enum
for toCheck
, пробовал что-то, но, вероятно, это неправильно:
export enum toCheck {
FIRST = 'FIRST',
LAST = 'LAST'
}
const computeSomething = (toCheck: string) => {
return clsx('flex', {
'flex-start': toCheck.FIRST,
'flex-end': toCheck.LAST
});
}
Ошибка гласит:
Свойство ‘FIRST’ не существует для типа ‘string’.
Есть идеи?
Комментарии:
1. Вы даже не используете параметр
toCheck: string
Ответ №1:
Проблема в том, что ваш toCheck
не ссылается на (предполагаемое) перечисление из-за того, что ваш параметр назван тем же именем ( toCheck: string
). Изменение имени любого из них должно решить проблему:
export enum ToCheckEnum {
FIRST = 'FIRST',
LAST = 'LAST'
}
const computeSomething = (toCheck: string) => {
return clsx('flex', {
'flex-start': ToCheckEnum.FIRST,
'flex-end': ToCheckEnum.LAST
});
}
Соглашение заключается в том, что enum / type должен иметь регистр Pascal, поэтому я думаю, что этот способ лучше.
Ответ №2:
Почему вы передаете toCheck в качестве аргумента? Просто сделайте это:
export enum ToCheckEnum {
FIRST = 'FIRST',
LAST = 'LAST'
}
const computeSomething = (toCheck: ToCheckEnum) => {
return clsx('flex', {
'flex-start': toCheck === ToCheckEnum.FIRST,
'flex-end': toCheck === ToCheckEnum.LAST
});
}
Комментарии:
1. потому что мне нужно знать, какой вариант запустить
2. Я обновил ответ
Ответ №3:
Вы затеняете перечисление, используя то же имя для своего параметра. Используйте другое имя для перечисления и параметра, чтобы избежать этого. Идиоматическим падежом для перечислений является PascalCase.
После этого просто используйте универсальный, который расширяет тип перечисления, и у вас не должно возникнуть никаких проблем:
declare function clsx (...args: unknown[]): void;
enum ToCheck {
FIRST = 'FIRST',
LAST = 'LAST',
}
const computeSomething = <T extends typeof ToCheck>(toCheck: T) => {
return clsx('flex', {
'flex-start': toCheck.FIRST,
'flex-end': toCheck.LAST
});
}
computeSomething(ToCheck); // ok