xstate-codegen
gives you 100% type-safe usage of XState in Typescript. You get type safety on:
- Transition targets:
on: {EVENT: 'deep.nested.state'}
- Services
- Guards
- Activities
- Actions
- The
initial
attribute state.matches('deep.nested.state')
This works by introspecting your machine in situ in your code. With this Thanos-level power, we can click our fingers and give you 100% type safety in your state machines.
xstate-codegen "src/**/**.machine.ts"
Instead of importing createMachine
or Machine
from xstate
, import them from @xstate/compiled
:
import { createMachine } from '@xstate/compiled';
const machine = createMachine();
You must pass three type options to createMachine/Machine
:
- The desired shape of your machine's context
- The list of events your machine accepts, typed in a discriminated union (
type Event = { type: 'GO' } | { type: 'STOP' };
) - A string ID for your machine, unique to your project.
For instance:
import { Machine } from '@xstate/compiled';
interface Context {}
type Event = { type: 'DUMMY_TYPE' };
const machine = Machine<Context, Event, 'uniqueId'>({});
import { useMachine } from '@xstate/compiled/react';
import { machine } from './myMachine.machine'
const [state, dispatch] = useMachine(machine, {
// all options in here will be type checked
})
import { interpret } from '@xstate/compiled';
import { machine } from './myMachine.machine'
const service = interpret(machine, {
// all options in here will be type checked
})
xstate-codegen "src/**/**.machine.ts" --once
By default, the CLI watches for changes in your files. Running --once
runs the CLI only once.
xstate-codegen "src/**/**.machine.ts" --outDir="src"
By default, the CLI adds the required declaration files inside node_modules at node_modules/@xstate/compiled
. This writes the declaration files to a specified directory.
Note, this only writes the declaration files to the directory. The
.js
files still get written tonode_modules/@xstate/compiled
.