typescript - 如何使用 ...rest ...spread 正确键入函数包装器以获取重载?

标签 typescript axios overloading

我正在尝试为Axios npm package中的axios函数制作一个包装器.

该函数可以被调用为

axios(config: AxiosRequestConfig) 
// When URL is contained inside config

axios(
   url: string,
   config: AxiosRequestConfig, 
)
// when it's not

我的简单包装如下所示:

import axios from 'axios'

type AxiosArguments = Parameters<typeof axios>
const axiosWrapper = async (...args: AxiosArguments) => await axios(...args)

export default axiosWrapper

但是,当我尝试时,TypeScript 不会承受过载

export const fetchSomething = () => wrappedAxios({
    url: '/url/to/something/',
    method: 'get',
})

我收到错误:

Error:(5, 60) TS2345: Argument of type '{ url: string; }' is not assignable to parameter of type 'string'.

我该如何让它发挥作用?我更愿意学习一般情况下执行此操作,而不是仅仅从 Axios 导入正确的类型。

最佳答案

我可能会使用function overload :

async function axiosWrapper(config: AxiosRequestConfig): Promise<AxiosReturnValue>;
async function axiosWrapper(url: string, config: AxiosRequestConfig): Promise<AxiosReturnValue>;
async function axiosWrapper(urlOrConfig: string|AxiosRequestConfig, config?: AxiosRequestConfig): Promise<AxiosReturnValue> {
    if (typeof urlOrConfig === "string") {
        // The version with a URL
        return /*...*/;
    }
    // The version without
    return /*...*/;
}

AxiosReturnValue是上面的占位符。您希望它是您从包装器返回的任何内容。如果您要返回什么axios返回时,使用与其使用的相同的返回类型。 (如果这是 Promise 类型,请直接使用它,而不是在 Promise 内。例如,如果 axios 的返回类型是 Promise<Something> ,则使用 Promise<Something> 而不是 Promise<Promise<Something>> 。)

looks like axios 使用通用返回类型 AxiosResponse<T> 。如果是这样,那么:

async function axiosWrapper<T>(config: AxiosRequestConfig): Promise<AxiosResponse<T>>;
async function axiosWrapper<T>(url: string, config: AxiosRequestConfig): Promise<AxiosResponse<T>>;
async function axiosWrapper<T>(urlOrConfig: string|AxiosRequestConfig, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    if (typeof urlOrConfig === "string") {
        // The version with a URL
        return /*...*/;
    }
    // The version without
    return /*...*/;
}

关于typescript - 如何使用 ...rest ...spread 正确键入函数包装器以获取重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59562456/

相关文章:

function - dart 是否支持运算符重载

typescript - 如何在 typescript 中的类中声明枚举?

javascript - 缩放、旋转和平移后 Canvas 绘制点定位于单击区域

javascript - 将 "this"绑定(bind)到 TypeScript Lambda

javascript - 从 Web 调用时 Apiary API 端点返回空数据

scala - 为什么 Scala 编译器不允许使用默认参数的重载方法?

javascript - 在 TypeScript 中使用 JavaScript 库时不存在处理属性

javascript - Axios 不发布数据

javascript - 使用 axios 获取访问 token

Java重载概念