打字稿和传播运算符?

Posted

技术标签:

【中文标题】打字稿和传播运算符?【英文标题】:Typescript and spread operator? 【发布时间】:2016-03-14 18:58:03 【问题描述】:
function foo(x:number, y:number, z:number)  
   console.log(x,y,z);

var args:number[] = [0, 1, 2];

foo(...args);

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

提供的参数与调用目标的任何签名都不匹配。

【问题讨论】:

【参考方案1】:

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

类型检查要求展开元素与一个剩余参数相匹配。

无休息参数

但是您可以使用类型断言来实现动态化......它会为您转换回 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);

【讨论】:

【参考方案2】:

我认为@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

【讨论】:

你在几年前就回答了,但所有这些问题现在都已关闭,如果没有你的建议,仍然无法做到这一点。我不明白为什么这些问题被关闭了。我没有全部看完,但似乎是所有其他人的汇总的最后评论说要追查,然后就关闭了。【参考方案3】:
function foo(x:number, y:number, z:number)  
  console.log(x,y,z);

var args:[number, number,number] = [0, 1, 2];
foo(...args);

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


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

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

Demo in TSPlayground by Mr.@anask

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


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

foo(...args);

【讨论】:

我建议像this 这样的const 断言而不是注释元组,否则这是我认为的正确答案。 @jcalz 是的,先生,您的方法更好。非常感谢您的补充!我将冒昧地将您的答案导入现有答案,并标记您的签名。如果您将来打开新的独立答案,请告诉我;我将恢复对您方法的引用。

以上是关于打字稿和传播运算符?的主要内容,如果未能解决你的问题,请参考以下文章

类型的打字稿传播运算符[重复]

打字稿和多个类

打字稿和电子出口未定义

打字稿和 Knex

NodeJs 打字稿和模块问题

打字稿和正则表达式