【发布时间】:2021-07-28 05:38:00
【问题描述】:
(跟进此question)
我有一个函数接受带有一些状态定义的配置对象(它是一个状态机函数)。
例子:
const machine = createStateMachine({
initial: 'inactive',
states: stateNode({
inactive: {
on: { ACTIVATE: 'active' },
}),
active: stateNode({
on: { DEACTIVATE: 'inactive' },
effect(send) {
send('DEACTIVATE') // Only accepts "DEACTIVATE".
},
}),
},
});
用户可以通过调用send来切换当前状态,有两个地方可以使用:
- 从配置中的
effect函数返回 - 从
createStateMachine函数返回
我想从配置中尽可能多地推断,stateNode 是一个帮助类型推断的中间函数:
function stateNode<T extends Record<keyof T, PropertyKey>>({on, effect}: {
on: T, effect?: (send: (action: keyof T) => void) => void}) {
return { on, ...effect && { effect } }
}
到目前为止一切正常,但我想将“on”属性设为可选 - 有什么想法吗?
【问题讨论】:
-
我不明白...如果你省略了
on,那么你也必须省略effect,对吧?因为send()回调将采用never。但是你的状态节点只是{},所以你不必显式调用stateNode()。有点像this。这能如你所愿吗?还是我错过了什么。 -
公平的问题,我应该更好地解释它:当状态机进入或离开该状态时,可以使用效果来运行任意代码。在包含转换事件的状态中,您还可以
send一个事件,但这并不是在效果中可以完成的全部。因此,从那个原始示例中,我可以冻结: stateNode({ effect(){ console.log("Entered Frozen") } } }), -
那么,像this 这样的东西?如果是这样,我会尝试写下答案(尽管我发现我还没有回答上一个问题)
-
我已经准备好接受你对第一个的回答了,这个也很完美!我试图使用多个函数签名定义,但无法做到这一点。非常感谢您的所有帮助,如果有办法,我很想请您喝咖啡或啤酒;)
-
唯一的事情是,现在我将
never作为createStateMachine返回的函数的参数
标签: typescript typescript-generics