【问题标题】:RTK-Query conditional typing of BaseQueryFnBaseQueryFn 的 RTK-Query 条件类型
【发布时间】:2021-10-09 04:32:44
【问题描述】:

在 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 的函数使用这种类型,并让它正确限制我的query 端点的返回类型。即使我不使用BaseQueryFn 实用程序类型,而是手动键入上述函数,然后将其传递给baseQuery,我仍然没有得到query 的返回限制我要。

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

更新

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

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

然后你的BaseQueryFn 类型就是BaseQueryFn&lt;BaseQueryDiscriminatedArg&gt;

【问题讨论】:

    标签: redux-toolkit rtk-query


    【解决方案1】:

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

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

    【讨论】:

    • 一个受歧视的工会在这里工作。谢谢。我实际上有一个更复杂的用例,它并不理想,但我会问一个不同的问题或继续聊天。
    猜你喜欢
    • 2022-11-23
    • 2022-08-22
    • 1970-01-01
    • 2023-01-15
    • 2022-10-07
    • 2022-10-05
    • 2022-10-16
    • 2022-01-17
    • 2022-08-18
    相关资源
    最近更新 更多