打字稿和传播操作符?

Ama*_*mes 29 typescript

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

foo(...args);
Run Code Online (Sandbox Code Playgroud)

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

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

Fen*_*ton 37

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

类型检查需要扩展元素以与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);
Run Code Online (Sandbox Code Playgroud)

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

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

使用Rest参数

另一种方法是,如果函数接受rest参数,它都可以正常工作.

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

foo(...args);
Run Code Online (Sandbox Code Playgroud)


Lan*_*Yan 9

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

你可以试试这个。就我个人而言,我认为这是最适合您的问题场景的答案。


@anask先生提供了更好的方法,更清晰,更简单,更容易维护。这也应该是 TypeScript 功能的最佳实践。

用于as const自动推断静态类型

@anask先生在 TSPlayground 中的演示

function foo(x: number, y: number, z: number) {
   console.log(x, y, z);
}

// here young !
var args = [0, 1, 2] as const;

foo(...args);
Run Code Online (Sandbox Code Playgroud)


Ogg*_*las 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);
Run Code Online (Sandbox Code Playgroud)

使用@ts-ignore忽略特定行,打字稿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);
Run Code Online (Sandbox Code Playgroud)

像任何一样使用.

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

(foo as any)(...args);
Run Code Online (Sandbox Code Playgroud)

链接有关传播运营商的文档:

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 /微软/打字稿/问题/ 15375