什么';从Typescript中的联合类型推断回调参数类型的最佳方法是什么?

什么';从Typescript中的联合类型推断回调参数类型的最佳方法是什么?,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,我正在尝试编写一个助手,让我在React应用程序中订阅特定类型的已调度操作。以下是我正在使用的操作界面: 枚举操作类型{ MoveToLine='MOVE_TO_LINE', MoveToColumn='MOVE_TO_COLUMN', } 界面移动线性作用{ 类型:ActionTypes.MoveToLine; 有效载荷:{line:number}; } 接口MoveToColumnAction{ 类型:ActionTypes.MoveToColumn; 有效载荷:{column:number

我正在尝试编写一个助手,让我在React应用程序中订阅特定类型的已调度操作。以下是我正在使用的操作界面:

枚举操作类型{
MoveToLine='MOVE_TO_LINE',
MoveToColumn='MOVE_TO_COLUMN',
}
界面移动线性作用{
类型:ActionTypes.MoveToLine;
有效载荷:{line:number};
}
接口MoveToColumnAction{
类型:ActionTypes.MoveToColumn;
有效载荷:{column:number};
}
类型Actions=MoveToLineAction | MoveToColumnAction;
下面是
subscribeToAction
的实现:

const subscribeToAction=(
类型:T,
行动:(a:a)=>无效,
)=>(动作:A)=>{
if(action.type==类型){
行动;
}
};
我希望能够像这样使用它:

//订阅特定类型的操作
subscribeToAction(ActionTypes.MoveToLine,action=>{
action.payload.line;
});
我遇到的问题是,我希望自动推断
onAction
侦听器中的
action
类型。在上面的代码中,我得到一个
属性'payload'在类型{type:string;}'上不存在
错误。我可以手动键入侦听器,如下所示:

subscribeToAction(ActionTypes.MoveToLine,(action:MoveToLineAction)=>{
action.payload.line;
});

但是传入一个
ActionType
,然后还必须在侦听器中指定操作类型,这似乎是多余的。关于如何避免这样做,你们有什么建议吗?

以下是我的建议:

type ActionOfType<T extends ActionTypes> = Extract<Actions, { type: T }>;

const subscribeToAction = <T extends ActionTypes>(
    type: T,
    onAction: (a: ActionOfType<T>) => void,
) => (action: Actions) => {
    if (action.type === type) {
        // assertion necessary or explicit type guard: 
        onAction(action as ActionOfType<T>);
    }
};

subscribeToAction(ActionTypes.MoveToLine,
    action => { // action inferred as MoveToLineAction
        action.payload.line;
    }
);
type ActionOfType=Extract;
常数subscribeToAction=(
类型:T,
onAction:(a:ActionOfType)=>void,
)=>(动作:动作)=>{
if(action.type==类型){
//断言必需或显式类型保护:
onAction(action作为ActionOfType);
}
};
subscribeToAction(ActionTypes.MoveToLine,
action=>{//推断为MoveToLineAction的action
action.payload.line;
}
);
subscribeToAction()
中不需要两个泛型参数。您希望
T
对应于作为
type
传入的
ActionTypes
成分,并且希望
onAction
回调的参数自动约束到
Actions
的对应成分。
ActionOfType
type函数显示了如何执行此操作。哦,
subscribeToAction
的返回值应该是一个执行任何
操作的函数,对吗?这就是为什么要进行
if(action.type==type)
检查

还要注意,由于
action
属于
Actions
类型,因此需要告诉编译器,如果(action.type===type)
测试
实际上将
action
缩小为
ActionOfType
。我只使用类型断言


好的,希望这对你有帮助。祝你好运

谢谢,这看起来像我要找的。不知道
提取
。我要试一试。:)