我尝试为将在 xstate 中处理的事件创建类型。
目前 xstateprocessChangeEvent
使用参数调用该函数DefinedEvent
。无法更改此类型。
应该始终使用processChangeEvent
更改事件调用,因此我想实现一种方法来检查给定事件是否是更改事件或抛出错误。
一切都在 if 语句中运行。打字稿编译器实现了CHANGE
事件类型,因此我可以访问该value
属性。
export type Event<TType, TData = unknown> = { type: TType } & TData;
export type Value<TType> = { value: TType };
export type DefinedEvents = Event<'INC'> | Event<'DEC'> | Event<'CHANGE', Value<number>>;
function processChangeEventOK(event: DefinedEvents) {
if (event.type === 'CHANGE') {
return event.value; // NO COMPILER ERROR :-)
} else {
throw new Error(`Event must be of type CHANGE but is ${event.type}`);
}
}
问题是我需要这个很多次。因此我试图提取processEventOrThrowException
函数内部的逻辑。我知道回调必须以不同的方式输入Event<T
,但我不知道怎么做?
function processChangeEvent(event: DefinedEvents) {
return processEventOrThrowException(event, 'CHANGE', (castedEvent) => {
return castedEvent.value; // COMPILER ERROR :-(
});
}
function processEventOrThrowException<TType>(event: Event<any>, type: string, callback: (castedEvent: Event<TType, unknown>) => any) {
if (event.type === type) {
return callback(event);
} else {
throw new Error(`Event must be of type CHANGE but is ${event.type}`);
}
}