Атрибут перечисления в 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ключевое слово, которое компилируется во что-то вроде этого, и я бы использовал его вместо того, чтобы катить ваше собственное. Строки - лучший вариант, если вам не нужно проверять, зацикливать или преобразовывать значения.

Другие вопросы по тегам