BaseQueryFn 的 RTK-Query 条件类型

RTK-Query conditional typing of BaseQueryFn

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

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

但是,与其让 body 成为 any,或者更严格的联合,我希望它根据 method 的类型而变化。因此,例如,如果这是一个简单的函数,我会这样输入:

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

但是,我似乎无法找到任何方法来为我传递给 baseQuery 的函数使用这种类型,并正确地限制我的 [=] 的 return 类型19=] 端点。即使我不使用 BaseQueryFn 实用程序类型,而是手动键入一个类似上面的函数,然后将其传递给 baseQuery,我仍然没有得到 [=19] 的限制=]的return就是我想要的。

有没有办法做这种 baseQuery 的条件输入?

更新

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

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

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

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

如果您有更多问题,聊天可能会有更多帮助。只需在 Reactiflux

上的 Redux 频道停留