XState: типизированные конечные автоматы
Моделируйте конечные автоматы с TypeScript в XState
«XState: типизированные конечные автоматы» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Зачем использовать XState с TypeScript
XState представляет состояние приложения в виде явных конечных автоматов. С TypeScript состояния, события и контекст полностью типизированы, что предотвращает недопустимые переходы состояний во время компиляции.
import { createMachine, assign } from "xstate";Определение типов автомата
XState v5 использует параметры типов для контекста, событий и состояний. Определите их до создания автомата.
type TrafficContext = { count: number };
type TrafficEvent =
| { type: "TURN_GREEN" }
| { type: "TURN_YELLOW" }
| { type: "TURN_RED" };Создание типизированного автомата
Передайте типы контекста и событий в createMachine для полной проверки типов состояний и переходов.
const trafficMachine = createMachine({
types: {} as { context: TrafficContext; events: TrafficEvent },
id: "traffic",
initial: "red",
context: { count: 0 },
states: {
red: { on: { TURN_GREEN: "green" } },
green: { on: { TURN_YELLOW: "yellow" } },
yellow: { on: { TURN_RED: "red" } },
},
});Типизированный контекст с assign
Используйте assign для обновления контекста — TypeScript проверяет, что возвращаемая частичная структура контекста соответствует определённому типу.
const machine = createMachine({
types: {} as { context: TrafficContext; events: TrafficEvent },
// ...
entry: assign({ count: 0 }),
on: {
TURN_GREEN: {
actions: assign(({ context }) => ({ count: context.count + 1 })),
},
},
});Использование автомата в React
Хук useMachine из @xstate/react возвращает типизированные состояние и функцию отправки событий.
import { useMachine } from "@xstate/react";
function TrafficLight() {
const [state, send] = useMachine(trafficMachine);
// state.value: "red" | "green" | "yellow"
// send: (event: TrafficEvent) => void
return <button onClick={() => send({ type: "TURN_GREEN" })}>Go</button>;
}Типизированные защитные условия
Функции проверки условий получают типизированные контекст и событие, поэтому условия проверяются относительно правильных типов.
const machine = createMachine({
types: {} as { context: TrafficContext; events: TrafficEvent },
states: {
red: {
on: {
TURN_GREEN: {
guard: ({ context }) => context.count < 10, // context: TrafficContext
target: "green",
},
},
},
},
});Типизированные действия
Именованные действия можно типизировать, объявив их в конфигурации автомата и реализовав через setup.
import { setup } from "xstate";
const machine = setup({
types: {} as { context: TrafficContext; events: TrafficEvent },
actions: {
logTransition: ({ context, event }) => {
console.log(context.count, event.type);
},
},
}).createMachine({ /* ... */ });Параллельные состояния
XState поддерживает параллельные (ортогональные) области. TypeScript отслеживает значения параллельных состояний как объекты.
states: {
ui: {
type: "parallel",
states: {
modal: { initial: "closed", states: { closed: {}, open: {} } },
tooltip: { initial: "hidden", states: { hidden: {}, visible: {} } },
},
},
}Сопоставление состояний
Используйте state.matches(), чтобы проверить текущее состояние — XState типизирует этот вызов для известных имён состояний.
const [state] = useMachine(trafficMachine);
if (state.matches("green")) {
// TypeScript knows we're in the green state
}Инспектор XState
Подключите инспектор XState для визуальной отладки конечных автоматов во время разработки, не теряя типобезопасность в рабочем коде.
import { inspect } from "@xstate/inspect";
inspect({ iframe: false }); // opens state machine inspectorИтоги: типизация XState
Типизированные автоматы XState определяют типы контекста и событий, используют assign для типизированных обновлений контекста и интегрируются с React через useMachine, обеспечивая полную типизацию состояния и отправки событий.
Быстрая проверка
Что делает свойство types в конфигурации автомата XState v5?
Чему Вы научились
XState с TypeScript предоставляет полностью типизированные конечные автоматы: определяйте типы контекста и событий, используйте assign для типизированных обновлений, защитных условий и действий. Хук useMachine предоставляет типизированные состояние и отправку событий в компонентах React.
Изучай TypeScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 101
- Уроки
- 352
Часто задаваемые вопросы
Урок «XState: типизированные конечные автоматы» бесплатный?
Да — полный текст урока «XState: типизированные конечные автоматы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «XState: типизированные конечные автоматы»?
Моделируйте конечные автоматы с TypeScript в XState Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «XState: типизированные конечные автоматы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типизация срезов и асинхронных действий Redux Toolkit
- Шаблоны типизации хранилищ Zustand
- XState: типизированные конечные автоматы
- Производное состояние и селекторы с типами