【问题标题】:Multidimensional array argument type inference多维数组参数类型推断
【发布时间】:2019-06-12 09:50:11
【问题描述】:

当传递一个通用多维数组 T[][](或 T[] 的其余参数)时,看起来 typescript 期望第一个数组后面的数组类型是第一个数组类型的超集。

function abc<T>(values: T[][]): T[] {
    return values[0];
}

abc([[1], ['string'], [2], [3]]) // Error: Type 'string' is not assignable to type 'number'.

这是为什么呢?我可以让它推断类型为 (number | string)[][]?

【问题讨论】:

    标签: typescript multidimensional-array tuples type-inference


    【解决方案1】:

    为什么不提示它是联合类型?

    abc<string | number>([[1], ['string'], [2], [3]])
    

    在您的情况下,它会给您错误,因为 TS 假定您希望 T 是单一类型,而不是联合类型。

    想象一下,如果 TS 总是与您放入数组中的任何类型一起使用,并且只是扩展类型以匹配它。您将失去类型检查的全部好处,并可能最终得到 string | number | boolean | etc 联合类型,它基本上等同于 any,不太可能是您想要的。

    【讨论】:

      【解决方案2】:

      所以最后我想出了如何使这项工作。

      如果您将多维数组指定为泛型类型,它将按预期工作:

      function abc<T, TMultiArray extends T[][]>(arr: TMultiArray): T[] {
          // Pseudo logic that returns any of the values
          return arr[Math.floor(Math.random() * arr.length)];
      }
      

      这不再给出错误,默认情况下将返回类型推断为未知[]

      abc([[1], ['string']])
      

      这会产生预期的错误

      const y: number[] = abc([[2], ['string']]) // Type 'string' is not assignable to type 'number'.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多