TypeScript 中的递归泛型

Hav*_*uit 4 generics typescript recursive-type

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

这将是理想的:

type MyObject = Record<string, string | string[] | number | boolean | MyObject>
Run Code Online (Sandbox Code Playgroud)

但它给出了错误

类型别名“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>{}
Run Code Online (Sandbox Code Playgroud)

有没有办法做我想做的事,或者我应该坚持下去Record<string, unknown>

jca*_*alz 8

编译器在意识到您指定的类型以受支持的方式递归之前就放弃了,因为它在检查循环性之前不会探测实用程序类型Record定义。这是 TypeScript 的设计限制。有关说明,请参阅microsoft/TypeScript#41164 。

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

type MyObject = 
  { [k: string]: string | string[] | number | boolean | MyObject } // okay
Run Code Online (Sandbox Code Playgroud)

其工作没有错误。

Playground 代码链接