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; };