function foo(x:number, y:number, z:number) {
console.log(x,y,z);
}
var args:number[] = [0, 1, 2];
foo(...args);
为什么我在Typescript Playground中收到此错误???
提供的参数不匹配任何呼叫目标的签名。
答案 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参数,它就会像你期望的那样工作。
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);
您可以尝试一下。就我个人而言,我认为这是最适合您问题情况的答案。