打字稿:在至少需要一个参数的情况下使用扩展运算符

时间:2019-01-21 10:37:32

标签: typescript parameters

我正在学习如何在打字稿中使用rest参数/扩展运算符。现在,我需要编写一个将数组作为参数的函数,并且我想使用rest运算符。这是功能:

insert(elem: number, ...elems: number[])

这里有elem参数,因为我需要数组至少包含一个元素。

因此,给定这样的数组:

const numArray = [1, 2, 3, 4]

如何将数组传递给函数?我尝试了以下操作,但它给了我一个错误:

insert(...numArray)

我理解该错误,因为numArray可能有0到N个元素,并且该函数至少需要一个元素,但是我不知道对此的最佳解决方案。

有什么办法可以做到这一点?

注意insert函数是我正在开发的库的一部分,因此我需要使其尽可能地可用,而不取决于用户的使用方式利用它

2 个答案:

答案 0 :(得分:1)

问题在于数组的长度是任意的。如果您将其键入为元组,并带有数字元素,然后再加上其余任意数量的数字,则它将起作用。

function insert(elem: number, ...elems: number[]) { }

const numArray:[number, ...number[]] = [1, 2, 3, 4]

insert(...numArray)

您还可以使用函数来推断将const输入为元组:

function insert(elem: number, ...elems: number[]) { }
function tuple<T extends any[]>(...a: T) { return a;}
const numArray = tuple(1, 2, 3, 4);

insert(...numArray)

答案 1 :(得分:0)

您可以创建至少一个(或多个)项目的数组类型并将其展开:

function insert(...elem: [number, ...number[]]) { 
  // ...
}

typings

你甚至可以写一个辅助类型,例如:

type AtLeastOne<T> = [T, ...T[]]

function insert(...element: AtLeastOne<number>) {
  //...
}