【问题标题】:Typescript: Use of spread operator when at least one parameter is required打字稿:需要至少一个参数时使用扩展运算符
【发布时间】:2019-06-14 17:37:10
【问题描述】:

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

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

elem 参数在那里是因为我需要数组至少有一个元素。

所以,给定一个这样的数组:

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

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

insert(...numArray)

我理解错误,因为 numArray 可能有 0 到 N 个元素,而函数需要至少一个元素,但我不知道最好的解决方案。

有什么方法可以实现吗?

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

【问题讨论】:

    标签: typescript parameters


    【解决方案1】:

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

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

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

    type AtLeastOne<T> = [T, ...T[]]
    
    function insert(...element: AtLeastOne<number>) {
      //...
    }
    

    【讨论】:

      【解决方案2】:

      问题是数组是任意长度的。如果您将其键入为一个元组,一个数字元素后跟任意数量的数字,它将起作用。

      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)
      

      【讨论】:

      • insert 函数是我正在开发的库的一部分,因此我需要该函数的解决方案,而不是数组本身的解决方案。抱歉没有指定
      • @jacosro 如果不更改数组,就无法做到这一点。如果你想允许数组,那么你不能要求它们至少有一个元素(你可以使用insert(...elems: number[]),但这不需要数组中的任何元素)如果你强制至少一个元素,那么调用者需要使用元组来使用展开语法。
      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2017-12-09
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多