TypeScript 中的递归泛型

2023-12-06

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

这将是理想的:

type MyObject = Record<string, string | string[] | number | boolean | MyObject>

但它给出了错误

类型别名“MyObject”循环引用自身.ts(2456)

我可以通过使用接口作弊来解决这个问题:

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实用型在检查圆度之前。这是 TypeScript 的设计限制。看微软/TypeScript#41164以获得解释。

这里的修复方法是替换Record<string, XYZ>最终变成了带有字符串的类型索引签名 like { [k: string]: XYZ }:

type MyObject = 
  { [k: string]: string | string[] | number | boolean | MyObject } // okay

其工作没有错误。

Playground 代码链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 中的递归泛型 的相关文章