Типы TypeScript

FAST Element — это современная библиотека для создания веб-компонентов, тесно интегрированная с TypeScript. Использование типов в FAST Element обеспечивает строгую проверку данных, автоматическую подсветку ошибок и поддержку автодополнения, что особенно важно при работе с реактивными свойствами и сложными компонентами.


Примитивные типы

Основные примитивные типы, поддерживаемые TypeScript, полностью применимы в FAST Element:

  • string — текстовые данные, используемые для отображения или привязки.
  • number — числовые значения, часто применяются для размеров, счетчиков или индексов.
  • boolean — логические флаги, управляющие состоянием компонента.

Пример использования:

import { FASTElement, html, css, observable } from '@microsoft/fast-element';

class Counter extends FASTElement {
    @observable count: number = 0;
    @observable active: boolean = true;
}

Здесь count и active автоматически становятся реактивными свойствами. Любое их изменение инициирует обновление шаблона компонента.


Пользовательские интерфейсы (Interfaces)

TypeScript позволяет создавать интерфейсы для сложных структур данных. Это особенно полезно для компонентов, принимающих объекты с определенными полями:

interface User {
    id: number;
    name: string;
    email?: string; // необязательное свойство
}

class UserCard extends FASTElement {
    @observable user: User;
}

Использование интерфейсов повышает читаемость кода и защищает от ошибок, связанных с передачей некорректных данных.


Типы массивов и коллекций

Массивы и коллекции часто применяются для динамического рендеринга элементов в шаблоне FAST Element. Для типизации массивов используют:

@observable users: User[] = [];

Комбинация с реактивными свойствами позволяет автоматически обновлять DOM при изменении содержимого массива.

Для более сложных коллекций можно использовать тип Map или Set:

@observable userMap: Map<number, User> = new Map();

Изменение структуры коллекции можно отслеживать с помощью методов splice, push и реактивных наблюдателей.


Перечисления (Enums)

Перечисления помогают ограничить значения свойства предопределенным набором:

enum ButtonType {
    Primary = 'primary',
    Secondary = 'secondary',
    Danger = 'danger'
}

class AppButton extends FASTElement {
    @observable type: ButtonType = ButtonType.Primary;
}

Применение enums позволяет избежать опечаток и поддерживает строгую типизацию при передаче данных в шаблон.


Универсальные типы (Generics)

FAST Element и TypeScript отлично работают с дженериками для создания переиспользуемых компонентов:

class ListComponent<T> extends FASTElement {
    @observable items: T[] = [];
}

Такой подход позволяет создавать компонент списка для любых типов данных без потери типовой безопасности.


Типы для событий

События в FAST Element можно типизировать, чтобы обеспечить строгую проверку:

class MyComponent extends FASTElement {
    handleClick(event: MouseEvent) {
        console.log(event.clientX, event.clientY);
    }
}

Для кастомных событий используют CustomEvent с дженериком, указывающим тип detail:

class ItemSelectedEvent extends CustomEvent<{ id: number }> {}

this.dispatchEvent(new ItemSelectedEvent({ id: 42 }, { bubbles: true, composed: true }));

Это гарантирует, что обработчики событий получают строго типизированные данные.


Типы реактивных свойств

В FAST Element свойства могут быть реактивными через декоратор @observable или функцию attr:

import { FASTElement, attr, observable } from '@microsoft/fast-element';

class ProductCard extends FASTElement {
    @attr name: string;
    @attr price: number;
    @observable inStock: boolean = true;
}
  • @attr связывает свойство с атрибутом HTML.
  • @observable делает свойство реактивным для обновления DOM при изменении значения.

Типизация обеспечивает правильное преобразование значений из строковых атрибутов в нужный тип.


Комбинированные и условные типы

TypeScript позволяет создавать сложные типы с объединением и условной логикой, что особенно полезно для компонентов с разными режимами работы:

type Status = 'idle' | 'loading' | 'error' | 'success';

class Loader extends FASTElement {
    @observable status: Status = 'idle';
}

Такой подход предотвращает передачу некорректных строк и облегчает автодополнение в IDE.


Типы для слотов и шаблонов

FAST Element поддерживает типизацию контента слотов через Template:

import { html, Template } from '@microsoft/fast-element';

class Card<T> extends FASTElement {
    contentTemplate?: Template<T>;
}

Это позволяет безопасно передавать динамический контент и использовать привязку с конкретным типом данных.


Итоговая типизация компонентов

Использование TypeScript в FAST Element обеспечивает:

  • Строгую проверку всех свойств и событий.
  • Безопасность при работе с коллекциями и объектами.
  • Поддержку дженериков и интерфейсов для масштабируемого кода.
  • Снижение количества ошибок на этапе компиляции и улучшение автодополнения.

Эффективная типизация становится ключевым инструментом при создании сложных и переиспользуемых веб-компонентов, повышая надежность и предсказуемость работы приложений.