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 频道停留
在 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 频道停留