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

TypeScript/Axios/Cheerio爬虫遇错误:类型对象无法分配给never参数

解决TypeScript中数组push对象时的"never"类型错误

问题原因

你遇到的错误是因为TypeScript初始化空数组const contestlist = []时,默认会将其推断为never[]类型——TS无法确定这个数组应该存储什么类型的元素。当你尝试向其中push一个具体结构的对象时,类型不匹配就会触发错误。

解决方案

通过明确指定数组的元素类型就能解决这个问题,最佳实践是先定义一个接口来描述竞赛数据的结构,再用这个接口来约束数组类型:

步骤1:定义接口

在函数外部或合适位置定义描述竞赛数据的接口:

interface Contest {
  contestcode: string;
  contestname: string;
  conteststart: string;
  contestduration: string;
  startsin: string;
}

步骤2:初始化带类型的数组

把原来的空数组初始化代码改成带类型声明的版本:

const contestlist: Contest[] = [];

修改后的完整代码

interface Contest {
  contestcode: string;
  contestname: string;
  conteststart: string;
  contestduration: string;
  startsin: string;
}

async function datascraper(){
    try{
        const {data} = await axios.get(url);
        const $ = load(data);
        const contests = $('.MuiTableBody-root',$.html());
        // 明确指定数组类型为Contest[]
        const contestlist: Contest[] = [];
        
        contests.each((idx,el)=>{
            const contestdetails: Contest = {
                contestcode: '',
                contestname: '',
                conteststart: '',
                contestduration: '',
                startsin:''
            };

            contestdetails.contestcode = $(el).children('p').text();
            // 现在push不会再报错
            contestlist.push(contestdetails);
        });

        console.dir(contestlist);
    }
    catch(err){
        console.log(err);
    }
}

额外说明

你之前尝试用string[]肯定不行,因为数组里存的是对象不是字符串。定义接口后一定要把数组的类型指定为接口的数组类型(Contest[]),这样TS就能正确推断元素类型,不会再出现never类型的错误。

内容的提问来源于stack exchange,提问作者SpaciousCoder78

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:23:35