【发布时间】:2021-02-17 00:55:04
【问题描述】:
我有一个方法useActions,它接受一个函数数组并返回一个绑定动作数组,基本上像:
function useActions<A>(
actions: Array<ActionCreator<A> | ActionCreatorWithoutPayload>
): Array<ActionCreator<A> | ActionCreatorWithoutPayload> {
const dispatch = useDispatch()
return useMemo(() => {
return actions.map((a) => bindActionCreators(a, dispatch))
}, [actions, dispatch])
}
用法是这样的:
const [doFoo, doBar] = useActions([actions.doFoo, actions.doBar])
现在的问题是,doFoo 和 doBar 需要完全相同类型的参数。我设法通过编写额外的重载类型提示来解决这个问题:
function useActions<A extends ActionCreator<any>>(actions: [A]): [A]
function useActions<A extends ActionCreator<any>, B extends ActionCreator<any>>(actions: [A, B]): [A, B]
function useActions<A extends ActionCreator<any>, B extends ActionCreator<any>, C extends ActionCreator<any>>(
actions: [A, B, C]
): [A, B, C]
但这感觉很麻烦。是否有能够支持 n 个参数的通用方法?
【问题讨论】:
-
如果你改用命名属性会更容易,即。
const {doFoo, doBar} = useActions(actions)。那是破坏交易吗?我认为可以通过元组映射来完成,但我更擅长对象映射!
标签: typescript redux typescript-generics