所以我追求在我的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操场像上面一样
1条答案
按热度按时间cvxl0en21#
尝试将参数定义为数组,然后决定需要多少个参数:
Playground链接。