【发布时间】:2020-08-28 00:56:21
【问题描述】:
我的状态有一个类型,还有一个消息处理程序(thunk)的对象,它被显式键入为Record<string, (val: any) => AppThunk>
我收到的传入消息是对象,它们的键可以与消息处理程序对象的键匹配,在这种情况下,我想调用消息处理程序,或者它们的键可以与 DataState 的键匹配,在这种情况下,我只想将它们发送到updateState。
下面的代码可以正常工作。
type DataState = {
startRequestCounter: -1,
startResponseCounter: -1,
stopRequestCounter: -1,
stopResponseCounter: -1,
robotMode: RobotMode.Idle as RobotMode,
}
const messageHandlers: Record<string, (val: any) => AppThunk> = {
startRequestCounter: () => async (dispatch, getState) => // do stuff,
startResponseCounter: (counter: number) => dispatch => // do stuff,
stopResponseCounter: (counter: number) => dispatch => // do stuff
}
export const handleMessage = (message: MessagePayload): AppThunk => (dispatch, getState) => {
Object.entries(message).forEach(([snakeKey, value]) => {
const key = camelCase(snakeKey)
// call the message handler for this message, if there is one
if (messageHandlers[key]) {
dispatch(messageHandlers[key](value))
}
// if not, update the state if we have a state for this message
else if (Object.keys(getState().data).includes(key)) { // <~~~~ HERE!!!!
dispatch(updateState({ [key]: value }))
}
})
}
不过,我觉得结尾的else if 可以写得更简洁一些。
else if (getState().data[key]) 有效(如果我忽略它),但 TypeScript 抱怨:
元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“{ startRequestCounter: number; startResponseCounter:数字; stopRequestCounter:数字; stopResponseCounter:数字; cuvettesCount:数量; pipettesCount:数量;机器人模式:机器人模式; }'。
我进行了一些搜索,看起来 keyof 可能是我要查找的内容,但在我输入时甚至找不到 keyof。
【问题讨论】:
标签: typescript