打字稿和传播操作符?

时间:2015-12-09 13:21:59

标签: typescript

function foo(x:number, y:number, z:number) { 
   console.log(x,y,z);
}
var args:number[] = [0, 1, 2];

foo(...args);

为什么我在Typescript Playground中收到此错误???

  

提供的参数不匹配任何呼叫目标的签名。

3 个答案:

答案 0 :(得分:35)

所以你可能错过了一个小句:

  

类型检查需要扩展元素与rest参数匹配。

没有休息参数

但你可以使用类型断言来动态...它会为你转换回ES5 / ES3:

function foo(x:number, y:number, z:number) { 
 console.log(x,y,z);
}
var args:number[] = [0, 1, 2];

(<any>foo)(...args);

这会导致您期望的apply函数调用相同:

function foo(x, y, z) {
    console.log(x, y, z);
}
var args = [0, 1, 2];
foo.apply(void 0, args);

使用Rest参数

另一种选择是,如果函数接受rest参数,它就会像你期望的那样工作。

function foo(...x: number[]) { 
 console.log(JSON.stringify(x));
}
var args:number[] = [0, 1, 2];

foo(...args);

答案 1 :(得分:6)

我认为@Fenton很好地解释了它,但我想补充一些文档和可能的解决方案。

解决方案:

功能过载。在这种情况下,我更喜欢这种解决方案,因为它保持某种类型的安全性并避免忽略和任何。原始方法和函数调用根本不需要重写。

function foo(...args: number[]): void
function foo(x: number, y: number, z: number) {
  console.log(x, y, z);
}
var args: number[] = [0, 1, 2];

foo(...args);

使用@ts-ignore忽略特定行TypeScript 2.3

function foo(x: number, y: number, z: number) {
  console.log(x, y, z);
}
var args: number[] = [0, 1, 2];
// @ts-ignore
foo(...args);

任意使用。

function foo(x: number, y: number, z: number) {
  console.log(x, y, z);
}
var args: number[] = [0, 1, 2];

(foo as any)(...args);

链接有关差价运营商的文档:

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html

关于此的讨论:

https://github.com/Microsoft/TypeScript/issues/5296 https://github.com/Microsoft/TypeScript/issues/11780 https://github.com/Microsoft/TypeScript/issues/14981 https://github.com/Microsoft/TypeScript/issues/15375

答案 2 :(得分:-1)

function foo(x:number, y:number, z:number) { 
  console.log(x,y,z);
}
var args:[number, number,number] = [0, 1, 2];
foo(...args);

您可以尝试一下。就我个人而言,我认为这是最适合您问题情况的答案。