【发布时间】:2019-08-28 09:19:49
【问题描述】:
我正在尝试编写一个帮助程序,让我订阅 React 应用程序中调度操作的特定类型。这些是我正在使用的操作界面:
enum ActionTypes {
MoveToLine = 'MOVE_TO_LINE',
MoveToColumn = 'MOVE_TO_COLUMN',
}
interface MoveToLineAction {
type: ActionTypes.MoveToLine;
payload: { line: number };
}
interface MoveToColumnAction {
type: ActionTypes.MoveToColumn;
payload: { column: number };
}
type Actions = MoveToLineAction | MoveToColumnAction;
这是subscribeToAction的实现:
const subscribeToAction = <A extends { type: string }, T extends ActionTypes>(
type: T,
onAction: (a: A) => void,
) => (action: A) => {
if (action.type === type) {
onAction(action);
}
};
我希望能够像这样使用它:
// Subscribe to a specific type of action
subscribeToAction(ActionTypes.MoveToLine, action => {
action.payload.line;
});
我遇到的问题是我希望自动推断onAction 侦听器中action 的类型。在上面的代码中,我得到一个Property 'payload' does not exist on type '{ type: string; }' 错误。我可以像这样手动输入监听器来解决这个问题:
subscribeToAction(ActionTypes.MoveToLine, (action: MoveToLineAction) => {
action.payload.line;
});
但传入ActionType 似乎是多余的,然后还必须在侦听器中指定操作类型。你们对如何避免这样做有什么建议吗?
【问题讨论】:
标签: typescript typescript-typings typescript-generics