typescript - TypeScript 中的递归泛型

标签 typescript generics recursive-type

我想声明一个简单的类型来替换一段代码中的any。我知道这将是一些对象式的论点,所以我可以使用 Record<string, unknown> ,但我宁愿更具体一点。
这将是理想的:

type MyObject = Record<string, string | string[] | number | boolean | MyObject>
但它给出了错误

Type alias 'MyObject' circularly references itself.ts(2456)


我可以通过使用接口(interface)作弊来解决这个问题:
type MyObject<T> = Record<string, string | string[] | number | boolean | T>

// eslint-disable-next-line @typescript-eslint/no-empty-interface
interface IMyObject extends MyObject<IMyObject>{}
有没有办法做我想做的事,还是我应该坚持 Record<string, unknown>

最佳答案

编译器在意识到您指定的类型是以受支持的方式递归之前就放弃了,因为它不探测 the Record utility type 的定义。在检查圆度之前。这是 TypeScript 的设计限制。见 microsoft/TypeScript#41164解释一下。
这里的修复是替换 Record<string, XYZ>最终变成一个带有字符串 index signature 的类型喜欢 { [k: string]: XYZ } :

type MyObject = 
  { [k: string]: string | string[] | number | boolean | MyObject } // okay
可以正常工作。
Playground link to code

关于typescript - TypeScript 中的递归泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67006206/

相关文章:

javascript - Angular 2 : Update FormControl validator after valueChanges

c++ - 分配自身的类型的分配器

未找到 Firebase 功能的 Typescript 声明

javascript - 将变量插入数组中的辅助子对象

javascript - typescript /ReactJS/setTimeout : 'this' implicitly has type 'any' because it does not have a type annotation. ts

c# - 默认非空泛型值

C# 泛型 : Constraining T where T : Object doesn't compile; Error: Constraint cannot be special class 'object'

java - 将泛型 Class<T> 作为参数传递

f# - 如何在 F# 中实现 “efficient generalized fold”?

haskell - 处理递归求和类型时如何减少代码重复