TypeScript Academy · Урок

XState: типизированные конечные автоматы

Моделируйте конечные автоматы с TypeScript в XState

Урок 3 из 413 шагов

«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 — локальная установка не требуется.

Все уроки этого курса

  1. Типизация срезов и асинхронных действий Redux Toolkit
  2. Шаблоны типизации хранилищ Zustand
  3. XState: типизированные конечные автоматы
  4. Производное состояние и селекторы с типами
← Назад к TypeScript Academy