【发布时间】: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<BaseQueryDiscriminatedArg>
【问题讨论】: