TypeScript类型错误:number[]无法赋值给number类型参数
解决TypeScript报错:Argument of type 'number[]' is not assignable to parameter of type 'number'
问题场景
执行以下TypeScript代码时,在results.push([...part])处触发类型不匹配报错:
function sostavChisla(arr: number[], n:number) { const sortedArr:number[] = arr.sort(); const results:number[] = []; const part:number[] = [] ; for(let i = 0; i < sortedArr.length; i++) { part.push(sortedArr[i]); const summ:number = part.reduce((acc, x) => acc + x); if (summ === n) { results.push([...part]); } if (summ > n) { part.pop(); i = sortedArr.indexOf(part[part.length - 1]); part.pop(); } } return results; }
报错原因
你将results的类型定义为number[](仅能存储单个数字的一维数组),但实际要推入的是number[]类型的子数组,两者类型不兼容,TypeScript的类型检查机制因此抛出错误。
修复方案
把results的类型修改为number[][](二维数字数组,用于存储多个数字子数组),同时修正数组排序的潜在问题:
function sostavChisla(arr: number[], n:number) { // 数字数组需传入比较函数,否则会按字符串排序导致结果错误 const sortedArr:number[] = arr.sort((a, b) => a - b); // 修正为二维数组类型 const results:number[][] = []; const part:number[] = [] ; for(let i = 0; i < sortedArr.length; i++) { part.push(sortedArr[i]); const summ:number = part.reduce((acc, x) => acc + x); if (summ === n) { results.push([...part]); } if (summ > n) { part.pop(); i = sortedArr.indexOf(part[part.length - 1]); part.pop(); } } return results; }
额外提醒
原代码中的arr.sort()默认按字符串规则排序,对数字数组会产生错误结果(比如[10, 2]会被排成[10, 2]而非[2, 10]),因此必须添加数字比较函数(a, b) => a - b实现正确的升序排序。
内容的提问来源于stack exchange,提问作者Rashid
相关产品推荐
相关产品推荐

