Typescript:返回函数类型保护使用泛型的问题

fnvucqvd  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(137)

所以我追求在我的react项目中有一个泛型函数来调用axios。因为我需要它是泛型的,这样我就可以在我的repo中使用它,所以我想出了这样一个想法

type XHR = 'get' | 'post' | 'delete'
function callApi(url: string) {
/\*\* will do some logic here \*/

    return <Response = any, Methods = XHR>(
        methodName: Methods,
        spec?: Methods extends 'get' ? never : object,
    ): Promise<Response> => {
        switch (methodName) {
            case 'get':
                return axios.get<Response>(url).then((resp) => resp.data)
            case 'delete':
                return axios
                    .delete<Response>(url, { data: { data: spec } })
                    .then((resp) => resp.data as Response)
            default:
                return axios[methodName as Exclude<XHR, 'delete' | 'get'>]<Response>(
                    url,
                    {
                        data: spec,
                    },
                ).then((resp) => resp.data)
        }
    }

}

这样我就可以调用钩子中的函数

let callGoogle = callApi('https://google.com')

return callGoogle('get')

//or
return callGoogle('post', {spec: 'foo'})

但问题就在这里,当我在callApi上声明return函数时,一定有什么地方出错了,导致了这个不返回错误

// need to throw ts error, since post need two paramaters
let result2 = callGoogle<{ rambo: number }>('post')

如果我的问题还不清楚,请让我知道我错过了什么。
我已经尝试了上面的一些代码,并且已经在ts playground中用一些案例进行了测试
这里有一个测试它打印脚本
TypeScriptPlayground
我已经试过在vs代码和typescript操场像上面一样

cvxl0en2

cvxl0en21#

尝试将参数定义为数组,然后决定需要多少个参数:

...args: U extends 'get' ? [] : [object]

Playground链接。

相关问题