多维数组参数类型推断

时间:2019-06-12 09:50:11

标签: typescript multidimensional-array tuples type-inference

传递通用多维数组T [] [](或T []的其余参数)时,打字稿希望第一个数组之后的数组类型是第一个数组类型的超集。

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)[] []吗?

2 个答案:

答案 0 :(得分:0)

为什么不给它提示您希望它成为联合类型?

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

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

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

答案 1 :(得分:0)

所以最后我弄清楚了如何进行这项工作。

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

beforeEnter

这不会再出现错误,默认情况下会推断返回类型为unknown []

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']])