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
相关产品推荐
相关产品推荐

