FAST Element предоставляет мощные механизмы для работы с константами и перечислениями, обеспечивая удобную типизацию, повторное использование и поддержку реактивного поведения компонентов. Они играют ключевую роль при создании предсказуемых, легко расширяемых веб-компонентов.
В FAST Element константы обычно определяются через ключевое слово
const и используются для хранения неизменяемых значений,
которые часто повторяются в компоненте, например, для классов CSS,
идентификаторов событий или стандартных значений свойств.
const BASE_CLASS = "fast-button";
const DEFAULT_WIDTH = 120;
const EVENTS = {
CLICK: "click",
FOCUS: "focus"
};
Особенности:
FAST Element не имеет встроенной поддержки enum, как в
TypeScript, но константные объекты или замороженные объекты
(Object.freeze) эффективно выполняют ту же функцию.
const ButtonSize = Object.freeze({
SMALL: "small",
MEDIUM: "medium",
LARGE: "large"
});
const ButtonType = Object.freeze({
PRIMARY: "primary",
SECONDARY: "secondary",
TERTIARY: "tertiary"
});
Преимущества использования замороженных объектов:
Константы и перечисления активно применяются для определения
допустимых значений свойств (@attr) компонента. Это
позволяет ограничивать вводимые значения и поддерживать строгую
типизацию при разработке.
import { FASTElement, html, css, attr } from "@microsoft/fast-element";
class MyButton extends FASTElement {
@attr size;
@attr type;
connectedCallback() {
super.connectedCallback();
if (!Object.values(ButtonSize).includes(this.size)) {
this.size = ButtonSize.MEDIUM;
}
if (!Object.values(ButtonType).includes(this.type)) {
this.type = ButtonType.PRIMARY;
}
}
}
MyButton.define({
name: "my-button",
template: html`<button class="${x => BASE_CLASS} ${x => x.size} ${x => x.type}"><slot></slot></button>`,
styles: css`
.fast-button.small { width: 80px; }
.fast-button.medium { width: 120px; }
.fast-button.large { width: 160px; }
`
});
Ключевые моменты:
Object.values(Enum) гарантирует
допустимые параметры.FAST Element поддерживает динамическое связывание констант с CSS Custom Properties для улучшения управляемости стилей и переиспользуемости значений.
const COLOR_PRIMARY = "#0078d4";
const COLOR_SECONDARY = "#e5e5e5";
const buttonStyles = css`
:host {
--button-primary: ${COLOR_PRIMARY};
--button-secondary: ${COLOR_SECONDARY};
}
button.primary {
background-color: var(--button-primary);
}
button.secondary {
background-color: var(--button-secondary);
}
`;
Преимущества:
Для управления состояниями компонентов (disabled,
loading, selected) удобнее всего использовать
перечисления, чтобы избегать строковых литералов и ошибок при написании
кода.
const ButtonState = Object.freeze({
DEFAULT: "default",
LOADING: "loading",
DISABLED: "disabled"
});
class StatefulButton extends FASTElement {
@attr state;
get isDisabled() {
return this.state === ButtonState.DISABLED;
}
get isLoading() {
return this.state === ButtonState.LOADING;
}
}
Особенности:
get isDisabled()) упрощают работу с
состояниями.Object.freeze для имитации перечислений,
что предотвращает случайное изменение.Константы и перечисления в FAST Element создают основу для предсказуемого поведения компонентов, упрощают управление стилями и состояниями, а также делают код более структурированным и поддерживаемым.