0

在 RTK 中,我使用自定义baseQuery来包装 axios,遵循此处的一般指导。但是,我似乎无法找到一种使用条件类型的方法BaseQueryArg。例如,我希望能够让我的 baseQuery 函数接受以下参数对象:

{
  url: string
  method: "GET" | "PUT" | "POST" | "DELETE"
  body: any
}

但是,而不是 have bodybe any,甚至是更严格的联合,我希望它取决于method. 因此,例如,如果这是一个简单的函数,我会这样输入:

function myBaseQueryFunction<T extends "GET"|"POST">(args: {
  url: string
  method: T
  body: T extends "POST" ? {someBodyData: string} : null
}){
  // do the query
}

但是,我似乎找不到任何方法来为我传递给的函数使用这种类型,baseQuery并让它正确地限制我的query端点的返回类型。即使我不使用BaseQueryFn实用程序类型,而是手动键入上述函数,然后将其传递给baseQuery,我仍然没有得到query我想要的对 return 的限制。

有没有办法做这种有条件的打字baseQuery

更新

根据下面接受的答案,处理此问题的最简单方法是使用有区别的联合方法,例如:

type BaseQueryDiscriminatedArg = 
  | {
      url: string
      method: "POST"
      body: {someBodyData: string}
     }
  | {
      url: string
      method: "GET"
      body?: null
     }

然后你的BaseQueryFn类型就是BaseQueryFn<BaseQueryDiscriminatedArg>

4

1 回答 1

0

我认为这应该可以通过使用可区分的联合类型作为参数来实现,method用作鉴别器。重载或泛型将不起作用,因为 TS 无法正确映射它们,因此导致错误的类型。

如果您对此有更多问题,聊天可能会有所帮助。只需在 Reactiflux 上的 Redux 频道停留即可

于 2021-08-04T13:23:10.497 回答