Атрибут перечисления в lit/lit-element
Мы пытаемся создать компонент со свойством
variant
это должно быть установлено только на
"primary"
или же
"secondary"
(перечисление). В настоящее время мы просто объявляем атрибут как String, но нам было интересно, есть ли лучший способ обработки перечислений? Например, должны ли мы каким-то образом подтверждать, что текущее значение является частью перечисления? Должны ли мы выдавать ошибку, если нет?
2 ответа
Я задал этот вопрос в Slack, и ответы, которые я получил, склонились к объявлению свойства как String и использованию
hasChanged()
для отображения предупреждения в консоли, если значение свойства недействительно. Стандартные элементы HTML принимают любую строку в качестве значений атрибутов и не вызывают исключений, поэтому веб-компоненты, вероятно, должны вести себя таким же образом.
Мне все это кажется разумным.
Если вы используете TypeScript, я бы рекомендовал использовать просто строки. Ты можешь использовать
export type MyEnum = 'primary' | 'secondary'
объявить это, а затем использовать
@property() fooBar: MyEnum
чтобы получить проверку времени сборки. Ты можешь использовать
@ts-check
сделать это на простом JS с помощью
@type MyEnum
тоже.
Это хорошо работает, если перечисления предназначены для параметров компонентов или соответствуют перечислениям на стороне сервера, которые будут проверяться снова.
Однако, если вы хотите проверять ввод данных пользователем в перечисления или многократно их перебирать, это не так хорошо. Когда JS запускается, у него нет видимости типа. Вам нужен объектный словарь, например:
const MyEnum = Object.freeze({
primary: 'primary',
secondary: 'secondary'
});
// Enforce type in TS
const value: keyof MyEnum;
// Validate
const validated = MyEnum[input.toLower()];
// Loop
for(const enumVal of Object.keys(MyEnum)) ...
// Or Convert to a different value type
const MyEnum = Object.freeze({
primary: 1,
secondary: 2
});
Они несколько своеобразны. Опять же, если вы используете TypeScript, у него есть
enum
ключевое слово, которое компилируется во что-то вроде этого, и я бы использовал его вместо того, чтобы катить ваше собственное. Строки - лучший вариант, если вам не нужно проверять, зацикливать или преобразовывать значения.