关于 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 中传播独特的泛型类型?

自定义npm包——typeScript版本

TypeScript: type alias 与 interface

Typescript reactjs无法将道具传播到输入标签

使用 TypeScript 传播休息抱怨调用目标的签名

Typescript + Svelte - 如何添加类型以传播组件道具