我想声明一个简单的类型来替换一段代码中的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/