type FixedArray<T, D extends number> = Array<T> & {
length: D
}
type NestedArrays<T> = Array<T | NestedArrays<T>>
type FixedArray<T, D extends number> = Array<T> & {
length: D
}
const a: FixedArray<FixedArray<FixedArray<number, 2>, 2>, 3> = [
[
[1, 2],
[1, 2],
],
[
[1, 2],
[1, 2],
],
[
[1, 2],
[1, 2],
],
]
我一直无法从子元素中自动推断出数组长度
据我所知,如果不使用函数,就无法进行所需的推理。该函数不必“做”任何事情,它只是在那里让您可以进行推理。在这种情况下,你可以这样做:
function fixed<ArrayType extends readonly unknown[]>(
...elements: ArrayType
): FixedArray<ArrayType[number], ArrayType["length"]> {
return elements;
}
然后将其用于您的示例是:
const a = fixed(
fixed(
fixed(1, 2),
fixed(1, 2)
),
fixed(
fixed(1, 2),
fixed(1, 2)
),
fixed(
fixed(1, 2),
fixed(1, 2)
),
);
console.log(a);
// ^? - const a: FixedArray<FixedArray<FixedArray<number, 2>, 2>, 3>
FixedArray
类型,您可以只使用只读元组:
function fixed<ArrayType extends readonly unknown[]>(
...elements: ArrayType
): Readonly<ArrayType> {
return elements;
}
用法相同;结果类型是
readonly [
readonly [
readonly [number, number],
readonly [number, number]
],
readonly [
readonly [number, number],
readonly [number, number]
],
readonly [
readonly [number, number],
readonly [number, number]
]
]