【问题标题】:typescript type max recursion limited to 9打字稿类型最大递归限制为 9
【发布时间】:2021-10-23 18:19:34
【问题描述】:

我终于成功地创建了一个泛型类型,它为我提供了所有可能的 json 键列表/值组合。我什至准备了一种限制递归的方法。

type EditAction<T,P extends keyof T,Prev extends any[]> = {
    data : T[P]
    id : [...Prev, P]
    prev : Prev
}

type EditActions<T, Depth extends number = 50, Prev extends any[] = []> = {
    [P in keyof T] : T[P] extends JsonType 
        ? (Prev["length"] extends Depth
            ? EditAction<T,P,Prev>
            : (EditAction<T,P,Prev> | EditActions<T[P],Depth,[...Prev,P]>)) 
        : EditAction<T,P,Prev>
}[keyof T]

即使有深度限制,如果深度高于 9,打字稿也会给我一个错误,但我不明白为什么?似乎打字稿最大递归限制为 50 所以有理由得到以下错误:

Type instantiation is excessively deep and possibly infinite.ts(2589)
(property) payload: EditActions<T, 50, []>

【问题讨论】:

    标签: typescript recursion typescript-typings


    【解决方案1】:

    您可以使用与 TypeScript 附带的 lib.es2019.array.d.ts 类似的方式限制递归深度。

    type FlatArray<Arr, Depth extends number> = {
        "done": Arr,
        "recur": Arr extends ReadonlyArray<infer InnerArr>
            ? FlatArray<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]>
            : Arr
    }[Depth extends -1 ? "done" : "recur"];
    

    【讨论】:

    • 我做了一些测试,当我使用你的方式限制深度时也会出现同样的问题。当我提供真正的 Json 作为参数时,我的类型正在工作,但是当我使用通用 Json 并尝试基于此通用类型编写函数时,它会产生很多与深度相关的问题。我想我将不得不做一些更简单的事情,即使这意味着降低我的类型的准确性
    • 如果可以的话,你可以试试class-validator & class-transformer 包。它们可以帮助您验证嵌套数组和对象。
    • 这个定义是天才的一击,帮助我摆脱了编译器几乎无限期挂起的令人讨厌的问题。说真的,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2021-06-30
    • 2017-09-07
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多