type SomeGeneric<T> = {
    x: T;
}

type TTest = SomeGeneric<TTest> & { a: string; }; // Type alias 'TTest' circularly references itself.

interface ITest extends SomeGeneric<ITest> { // OK
    a: string;
}

我不明白为什么允许接口(interface)在它们自己的声明中引用它们自己,而类型却不是。

最佳答案

类型别名不能递归(大多数情况下),而接口(interface)可以。如果你在 GitHub 上搜索,就会有几个关于原因的答案。

例如 RyanCavanaugh 解释 here :



或 DanielRosenwasser 的 here



如果需要递归类型,一般的解决方法是使用接口(interface)。

顺便提一下,这些规则并没有完全一致地执行。例如,虽然在您的情况下 SomeGeneric<TTest> 可以扩展为 { x: TTest } 编译器甚至不会尝试它,它只是失败了。但是,以下递归定义将起作用:

type TTest = { x: TTest } & { a: string; };

10-08 19:54