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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:25:21