这个问题与其说是实际的,不如说是学术的.
我有一个函数filledArray(val, ...dims)
,它接受填充值和可变维数,并构建一个填充了该值的嵌套多维数组,以满足维度中的规范.例如:
> filledArray('x', 5)
[ 'x', 'x', 'x', 'x', 'x' ]
> filledArray('x', 2, 5)
[ [ 'x', 'x', 'x', 'x', 'x' ],
[ 'x', 'x', 'x', 'x', 'x' ], ]
> filledArray('x', 2, 5, 1)
[ [ [ 'x' ], [ 'x' ], [ 'x' ], [ 'x' ], [ 'x' ] ],
[ [ 'x' ], [ 'x' ], [ 'x' ], [ 'x' ], [ 'x' ] ] ]
TypeScrip推断该函数的返回类型为any
.是否可以在类型系统中以某种方式表示真正的返回类型,从而将上面的三个返回值正确地类型化为string[]
、string[][]
和string[][][]
?(对于越来越深的数组,依此类推?)
此函数的一个示例实现:
function filledArray<T>(val: T, ...dims: number[]) {
if (dims.length == 0)
return val
let [dim, ...rest] = dims
return Array.from(Array(dim), _ => filledArray(val, ...rest))
}
有趣的是,指定固定数量的重载声明似乎会使函数中的最后...rest
个不知何故是错误的类型...