在 RTK 中,我使用自定义baseQuery
来包装 axios,遵循此处的一般指导。但是,我似乎无法找到一种使用条件类型的方法BaseQueryArg
。例如,我希望能够让我的 baseQuery 函数接受以下参数对象:
{
url: string
method: "GET" | "PUT" | "POST" | "DELETE"
body: any
}
但是,而不是 have body
be 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>