You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:05:23