TypeScript迁移报错:A spread argument must either have a tuple type or be passed to a rest parameter
TypeScript扩展参数报错解决方法
报错提示:
扩展参数必须是元组类型或传递给剩余参数
你的代码:
export const fetcher = async (...args) => { return fetch(...args).then(async (res) => { let payload; try { if (res.status === 204) return null; // 204 无响应体 payload = await res.json(); } catch (e) { /* 无操作 */ } if (res.ok) { return payload; } else { return Promise.reject(payload.error || new Error('出现错误')); } }); };
问题原因
...args未指定类型,TypeScript无法推断其与fetch参数结构的匹配关系,导致扩展时类型校验失败。
解决方案
给args指定与fetch参数一致的元组类型,有两种方式:
方式一:手动指定元组类型
export const fetcher = async (...args: [RequestInfo, RequestInit?]) => { return fetch(...args).then(async (res) => { let payload; try { if (res.status === 204) return null; // 204 无响应体 payload = await res.json(); } catch (e) { /* 无操作 */ } if (res.ok) { return payload; } else { return Promise.reject(payload.error || new Error('出现错误')); } }); };
[RequestInfo, RequestInit?]完全匹配fetch的参数签名:第一个参数为必填的请求信息(URL或Request对象),第二个为可选的请求配置。
方式二:自动提取参数类型
使用Parameters工具类型自动获取fetch的参数元组,更简洁灵活:
export const fetcher = async (...args: Parameters<typeof fetch>) => { return fetch(...args).then(async (res) => { let payload; try { if (res.status === 204) return null; // 204 无响应体 payload = await res.json(); } catch (e) { /* 无操作 */ } if (res.ok) { return payload; } else { return Promise.reject(payload.error || new Error('出现错误')); } }); };
内容的提问来源于stack exchange,提问作者Lukas0320
相关产品推荐
相关产品推荐

