在 Typescript 中递归泛型?

Tom*_*mas 5 types typescript

Typescript 使用以下代码引发错误:

type AndType<AstT> = { type: 'And', args: [AstT] };
type TrueType = { type: 'True' };
type BaseAST = AndType<BaseAST> | TrueType;
Run Code Online (Sandbox Code Playgroud)

抱怨Type alias 'BaseAST' circularly references itself.;但是,如果我将循环引用包装在一个对象中,则这些类型可以正常编译:

type AndType<AstT> = { type: 'And', args: [AstT] };
type TrueType = { type: 'True' };
type BaseAST = {value: AndType<BaseAST>} | {value: TrueType};
Run Code Online (Sandbox Code Playgroud)

为什么?有没有人参考定义此行为的文档?

小智 1

对于您的情况,最简单的解决方案是将AndType类型设置为接口,如下所示:

interface AndType<AstT> {
  type: 'And';
  args: [AstT];
}
type TrueType = { type: 'True' };
type BaseAST = AndType<BaseAST> | TrueType;
Run Code Online (Sandbox Code Playgroud)

一般来说,建议使用简单类型的接口,但这并不总是可行。已经给出的链接应该为您提供更深入的信息。