如何输入redux分派的返回类型

3npbholx  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(116)

我有以下代码,其中myAction是一个thunk:

export type ArgumentTypes<F extends Function> = F extends (
  ...args: infer A
) => any
  ? A
  : never;

const dispatched = <T extends Function>(action: T, args: ArgumentTypes<T>) => {
  const result = store.dispatch(action(args));
  return result;
};

const res = dispatched(myAction, null);

如何正确键入dispatched函数的ReturnTyperes当前显示any
其他所有的东西,包括dispatch都是正确的类型。redux中有没有类型可以转换这个?
sandbox
沙箱中res的预期类型为Promise<string>
更新:
我能把它降到这个程度

const dispatched = <T extends AsyncThunk<{}, {}, {}>>(
  action: T,
  args: ArgumentTypes<T>,
) => {
  const result = store.dispatch(action(args));
  return result;
};

const res = await dispatched(myAction, null).unwrap();

它现在正确地返回传入AsyncThunk<>的任何内容,但不确定如何使其泛型化

mzaanser

mzaanser1#

不管出于什么原因,<T extends Function>不能与内置类型Parameters<T>ReturnType<T>一起工作,但是<T extends (...args: any[]) => any>可以工作。
我在这里有点困惑,你想如何接受操作创建者的参数。可以有多个参数吗?你是以单独的参数还是数组的形式传递多个参数?你在问题dispatched(myAction, null)中的内容和你在沙箱dispatched(myAction, ["hello world"])中的内容是有区别的。在我看来,dispatched(myAction, "hello world")的语法要好得多。所以我就这么做。

const dispatched = <T extends (...args: any[]) => any>(
  actionCreator: T,
  ...args: Parameters<T>
) => {
  const action: ReturnType<T> = actionCreator(...args); <-- this intermediate assignment is the key.
  const result = store.dispatch(action);
  return result;
};
// res has type `AsyncThunkAction<string, string, AsyncThunkConfig>`
const res = dispatched(myAction, "hello world");

相关问题