传递通用多维数组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)[] []吗?
答案 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']])