这个 idea 是为我的聊天机器人自动化库创建一个有限状态机助手,以便与机器人交谈的人可以在对话的不同阶段进行.
我希望库的使用者为实例化状态机的函数提供"状态机描述符".
所有的行为都已经奏效了.我只是想为库的消费者改进静态类型.
这就是我想要实现的:
const myStateMachine = createStateMachine({
initialState: "state1",
states: {
state1: {
onMessage: (requester: MessageObj, stateMachine: StateMachineInstance) => {
requester.reply("hello1");
stateMachine.setState("state2");
}
},
state2: {
onMessage: (requester: MessageObj, stateMachine: StateMachineInstance) => {
requester.reply("hello2");
stateMachine.setState("state1");
}
}
}
});
下面是我面临的问题:方法stateMachine.setState("state2")
接受任何字符串,而不仅仅是描述符中提供的州的键.它应该接受"state1" | "state2"
,因为这些都是状态机应该具有的状态.
我试过很多不同的方法,但大多数都导致打字错误.我只是将它们恢复为一个泛型字符串,以便它可以编译.
以下是目前的类型:
type StateId = string;
type State =
{
onMessage: (
requester: MessageObj,
stateMachineInstance: StateMachineInstance
) => any;
}
type StateMachineDescriptor = {
initialState: StateId;
states: {
[stateId: string]: State,
}
};
type StateMachineInstance = StateMachineDescriptor & {
currentState: StateId;
setState: (newState: StateId) => void;
reset: () => void;
};