什么';从Typescript中的联合类型推断回调参数类型的最佳方法是什么?
我正在尝试编写一个助手,让我在React应用程序中订阅特定类型的已调度操作。以下是我正在使用的操作界面:什么';从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
枚举操作类型{
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
。我只使用类型断言
好的,希望这对你有帮助。祝你好运 谢谢,这看起来像我要找的。不知道提取
。我要试一试。:)