关于 TypeScript 中传播参数的问题
Posted
技术标签:
【中文标题】关于 TypeScript 中传播参数的问题【英文标题】:Question about spread argument in TypeScript 【发布时间】:2021-12-30 20:41:47 【问题描述】:这是我的代码。
import _ from 'lodash';
function test(num1: number, num2: number)
console.log(num1, num2);
test(..._.take(_.shuffle([0, 1, 2]), 2));
我在 TS 操场和 VSCode 上收到 TS2556
错误。
展开参数必须要么具有元组类型,要么被传递给休息参数。 (ts2556)
我在 repl.it 网站上也遇到了 TS2556
错误。
错误 TS2556:预期有 2 个参数,但有 0 个或更多。
我不知道如何解决这个问题。
【问题讨论】:
问题是_.take
的返回类型是number[]
..你可以添加类型断言:test(..._.take(_.shuffle([0, 1, 2]), 2) as [number, number]);
太棒了!!它非常适合我。
【参考方案1】:
当您期望(如错误指出的那样)0 或更多参数 时,应使用展开运算符。由于您的函数需要正好 2 个参数,不多也不少,所以写起来更有意义
const myArray = _.take(_.shuffle([0, 1, 2]), 2);
test(myArray[0], myArray[1]);
如果您不想出现运行时错误,请务必添加检查以防万一(特别是如果您不知道传递给 shuffle 的数组包含什么),方法是检查它是否包含这两个值.
休息参数的有效用例:
const myFunction = (requiredParameter: number, ...someOtherOptionalParams: number[]) =>
someOtherOptionalParams.map(param =>
// do something with optional params, if any
)
如果两个参数都是可选的,您的代码也可以工作:
function test(num1?: number, num2?: number)
console.log(num1, num2);
也就是说,该函数将获取数组的前两个值(如果有),并对它们进行处理。
【讨论】:
感谢您的解释。这是更干净的代码。因为我使用了幻数,所以我认为肯定会输入两个数字。以上是关于关于 TypeScript 中传播参数的问题的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript: type alias 与 interface