如何在TypeScript中使用扩展运算符

如何在TypeScript中使用扩展运算符,typescript,spread-syntax,Typescript,Spread Syntax,我有一个示例函数: const spreadingArray(arg1, arg2){ return arg1 + arg2; } const numbers = [4,5]; spreadArray(...numbers); // return 9 spreadArray.apply(this, numbers); // return 9 spreadArray(4, 5); // return 9 这三个函数示例应返回相同的结果。但是我在运行ng serve时出错: TS2556:

我有一个示例函数:

const spreadingArray(arg1, arg2){
   return arg1 + arg2;
}
const numbers = [4,5];

spreadArray(...numbers); // return 9
spreadArray.apply(this, numbers); // return 9
spreadArray(4, 5); // return 9
这三个函数示例应返回相同的结果。但是我在运行ng serve时出错:

TS2556:应为2个参数,但得到0个或更多

如果我对第一个
spreadArray(…numbers)
进行注释并运行
ng serve
它编译得很好,我会再次删除注释,它会自动重新编译,但它已经编译好了,所以它会继续运行,代码也会正常工作。这让我觉得这是一个语法错误,因为angular知道如何编译到es5,希望是
。在这种情况下应用(这个,数字)
。 注意:这里的问题不是为什么我应该使用扩展运算符,而是为什么TypeScript不理解它。我想使用它,因为它只是一个Javascript ES6的东西。 我正在使用@angular/cli 6.1.5、@angular 6.1.4,我已经体验了node 8.10和9.11以及typescript 2.7.2和2.9.2

更新:此
功能的真实示例:
我不是typescript方面的专家,但问题似乎是由
spreadingArray
函数上有两个参数引起的,但函数调用中的参数数量是动态的。尝试从函数签名中删除参数,并改用
参数
对象。
参数
上的文档可以


正如几对答案中所分享的,我们不清楚您试图从spreadingArray函数中实现什么,但是传递一个参数,如…number,将无法满足函数的精确两个参数的要求

因此,您可以进行拆分并获取第0个和第1个索引:

        this.spreadingArray(numbers[0], numbers[1]);  // return 9
        this.spreadingArray.apply(this, numbers); // return 9
        this.spreadingArray(4, 5); // return 9

或者,你可以考虑改变你的扩展数组函数如下:

spreadingArray(...args:number[]): number { 
   return args.reduce(function(total, number){
    return total + number;
}, 0);
}
工作代码:

/**类型脚本代码
课堂测试{
测试(){
console.log(this.spreadingArray(…numbers));//返回9
console.log(this.spreadingArray.apply(this,numbers));//返回9
console.log(this.spreadingArray(4,5));//返回9
}
spreadingArray(…args:number[]):number{
返回args.reduce(函数(总数,数字){
返回总数+个数;
}, 0);
}
}
常量数=[4,5];
让测试=新测试();
let button=document.createElement('button');
button.textContent=“测试输出”;
button.onclick=函数(){
test.test();
}
document.body.appendChild(按钮);
**/
/**生成的Javascript代码**/
var Test=/**@class*/(函数(){
函数测试(){}
Test.prototype.Test=函数(){
console.log(this.spreadingArray.apply(this,numbers));//返回9
console.log(this.spreadingArray.apply(this,numbers));//返回9
console.log(this.spreadingArray(4,5));//返回9
};
Test.prototype.spreadingArray=函数(){
var args=[];
对于(var_i=0;_idocument.body.appendChild(按钮)问题在于打字

如果你写
constnumbers=[4,5]
它等于写入
常量number:number[]=[4,5]
因此,当您将
number
传递给
spreadingArray
方法时,编译器无法检查您是否传递了两个值并给您一个异常

要解决此问题,您必须将
数字的正确类型定义为两个数字数组:

const numbers: [number, number] = [4,5];
或更改
排列阵列
方法以接受排列属性:

function spreadingArray(...values: number[]){
   return values.reduce((prev, current) => prev + current, 0);
}

您可以将代码改写为:

const spreadingArray = (arg1: number, arg2: number, ...args: number[]) => {
                        return arg1 + arg2;
                     }
const numbers: [number, number, ...number[]] = [4,5];
spreadingArray(...numbers)

你问的是打字稿;您的问题与角度无关。正如错误试图告诉您的那样,TypeScript不知道数组有多大。这是否回答了您的问题?好的,让我们看看真正的代码
.pipe()
上的函数允许我传递不同的函数,因为参数可以是map、filter。在我的例子中,我创建了一个调用.pipe(…pipeline)的util函数,它不知道它是一个map函数还是一个过滤器函数,它只是通过spread操作符传递。那代码是为别人而不是为我而运行的。
const spreadingArray = (arg1: number, arg2: number, ...args: number[]) => {
                        return arg1 + arg2;
                     }
const numbers: [number, number, ...number[]] = [4,5];
spreadingArray(...numbers)