【问题标题】: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'.