打字稿和传播运算符?
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 是的,先生,您的方法更好。非常感谢您的补充!我将冒昧地将您的答案导入现有答案,并标记您的签名。如果您将来打开新的独立答案,请告诉我;我将恢复对您方法的引用。以上是关于打字稿和传播运算符?的主要内容,如果未能解决你的问题,请参考以下文章