@@ -15,8 +15,10 @@ type TEvents = {
1515}
1616
1717
18- export type StatemachineTransitions < States extends TState , Events extends TEvents > = {
19- [ Type in Events [ "type" ] ] : ( ( state : States , payload : Events extends { type : Type } ? Events [ "data" ] : never ) => States | void )
18+ export type StatemachineTransitions < States extends TState , Events extends TEvents , BaseState extends IState > = {
19+ [ Type in Events [ "type" ] ] : [ BaseState ] extends [ never ] ?
20+ ( ( state : States , payload : Events extends { type : Type } ? Events [ "data" ] : never ) => States | void ) :
21+ ( ( state : States & BaseState , payload : Events extends { type : Type } ? Events [ "data" ] : never ) => States | void )
2022}
2123
2224export interface MachineMethods < States extends TState , Events extends TEvents , BaseState extends IState > {
@@ -40,7 +42,7 @@ const BASE_STATE = Symbol('BASE_STATE')
4042export class StateMachine < State extends TState , Events extends TEvents , BaseState extends IState > {
4143 current : State [ "current" ]
4244 private [ INITIAL_STATE ] : State [ "current" ]
43- private [ TRANSITIONS ] : StatemachineTransitions < State , Events >
45+ private [ TRANSITIONS ] : StatemachineTransitions < State , Events , BaseState >
4446 private [ STATE ] : any
4547 private [ BASE_STATE ] : BaseState
4648 private [ IS_DISPOSED ] = false
@@ -55,7 +57,7 @@ export class StateMachine<State extends TState, Events extends TEvents, BaseStat
5557 } )
5658 this [ VALUE ] [ IS_DISPOSED ] = true
5759 }
58- constructor ( transitions : StatemachineTransitions < State , Events > , state : State , baseState : BaseState ) {
60+ constructor ( transitions : StatemachineTransitions < State , Events , BaseState > , state : State , baseState : BaseState ) {
5961 this [ STATE ] = state
6062 this [ BASE_STATE ] = baseState
6163 this [ INITIAL_STATE ] = state . current
@@ -105,7 +107,7 @@ export type StatemachineFactory<States extends TState, Events extends TEvents, B
105107 create ( state : States , baseState : BaseState ) : Statemachine < States , Events , BaseState >
106108}
107109
108- export function statemachine < States extends TState , Events extends TEvents = never , BaseState extends IState = never > ( transitions : StatemachineTransitions < States , Events > ) : StatemachineFactory < States , Events , BaseState > {
110+ export function statemachine < States extends TState , Events extends TEvents , BaseState extends IState = never > ( transitions : StatemachineTransitions < States , Events , BaseState > ) : StatemachineFactory < States , Events , BaseState > {
109111 return {
110112 create ( state , baseState ) {
111113 return new StateMachine ( transitions , state as any , baseState as any )
0 commit comments