【问题标题】:Question about spread argument in TypeScript关于 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]);
  • 太棒了!!它非常适合我。

标签: typescript lodash spread-syntax


【解决方案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);
}

也就是说,该函数将获取数组的前两个值(如果有),并对它们进行处理。

【讨论】:

  • 感谢您的解释。这是更干净的代码。因为我使用了幻数,所以我认为肯定会输入两个数字。
猜你喜欢
  • 2011-02-14
  • 2021-06-18
  • 2011-02-09
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2020-10-04
  • 2013-08-07
  • 2023-01-03
相关资源
最近更新 更多