嵌套数组打字稿类型

问题描述 投票:0回答:1
    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],
    ],
]

我一直无法从子元素中自动推断出数组长度

javascript typescript
1个回答
0
投票

据我所知,如果不使用函数,就无法进行所需的推理。该函数不必“做”任何事情,它只是在那里让您可以进行推理。在这种情况下,你可以这样做: 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>

游乐场链接

FWIW,如果您不需要,您不需要自己的
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] ] ]

游乐场链接

© www.soinside.com 2019 - 2024. All rights reserved.