Модели¶
В XState вы можете моделировать контекст context и события event автомата извне, используя createModel(...). Это обеспечивает удобный способ строгого ввода контекста и событий, а также помощников для создания, назначения событий и других деталей реализации в будущем.
Использование createModel(...) совершенно необязательно и предназначено для улучшения взаимодействия с разработчиками. Основные причины его использования:
- Разделение и организация контекста и событий строго типизированным способом
- Предотвращение проблем с вводом текста с помощью
assign(...) - Указание создателей событий для более простого и безопасного создания событий
- Возможность совместного использования модели с другими машинами
- Будущие улучшения взаимодействия с разработчиками, такие как определение действий, защитных функций и т. д.
createModel(...)¶
Функция createModel(...) принимает:
| Параметр | Тип | Описание |
|---|---|---|
initialContext | object | Начальное значение контекста |
creators? | object | Объект, содержащий различные создатели событий |
Объект creators содержит свойства:
| Свойство | Тип | Описание |
|---|---|---|
events | object | Объект, содержащий создатели событий |
Ключи объекта creators.events — это типы событий, а значения — это функции, которые принимают любое количество аргументов и возвращают данные события.
Моделирование контекста¶
Поскольку модель определяет контекст автомата, модель можно использовать для определении автомата, чтобы установить ее начальный контекст с помощью model.initialContext и обновить контекст автомата с помощью model.assign.
Функция model.assign типизирована в соответствии с формой контекста модели, что делает ее удобной и надежной заменой действия assign.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Моделирование событий¶
Моделирование событий автомата в модели дает два преимущества:
- События можно создавать, вызывая
model.events.eventName(...) - Предоставляет информацию о типе для определения автомата, обеспечивая безопасность типов для определений действий
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | |
TypeScript¶
Функция createModel(...) определяет следующие типы:
contextвыводится из первого аргумента вcreateModel(initialContext, creators)eventвыводятся изcreators.eventsвcreateModel(initialContext, creators)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
Создание автомата из модели¶
Вместо того, чтобы явно указывать тип контекста и события как параметры типа в createMachine<TContext, TEvent>(...), следует использовать метод model.createMachine(...):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Сужение типов события¶
Когда действие assign() упоминается в options.actions, вы можете сузить тип события, которое передается в действие вторым аргументом model.assign(assignments, eventType):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Внимание
Назначенные действия с суженными типами событий нельзя помещать в свойство actions: {...} параметров автомата в createMachine(configuration, options). Это связано с тем, что действия в options.actions должны предполагать потенциально получение любого события, даже если конфигурация машины предполагает иное.
Извлечение типов из модели¶
Начиная с версии 4.22.1
Вы можете извлечь типы контекста и событий из модели, используя типы ContextFrom<T> и EventFrom<T>:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |