Typescript 使用递归类型别名会产生循环引用错误
根据递归类型,别名可以有效使用Typescript 使用递归类型别名会产生循环引用错误,typescript,graphql-js,Typescript,Graphql Js,根据递归类型,别名可以有效使用 export type IntrospectionType = { readonly kind: 'OBJECT'; }; export type IntrospectionListTypeRef< T extends IntrospectionTypeRef = IntrospectionTypeRef > = { readonly kind: 'LIST'; readonly ofType: T; }; export type
export type IntrospectionType = {
readonly kind: 'OBJECT';
};
export type IntrospectionListTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> = {
readonly kind: 'LIST';
readonly ofType: T;
};
export type IntrospectionNonNullTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> = {
readonly kind: 'NON_NULL';
readonly ofType: T;
};
export type IntrospectionTypeRef =
| IntrospectionNamedTypeRef
| IntrospectionListTypeRef
| IntrospectionNonNullTypeRef<
IntrospectionNamedTypeRef | IntrospectionListTypeRef
>;
export type IntrospectionNamedTypeRef<
T extends IntrospectionType = IntrospectionType
> = {
readonly kind: T['kind'];
};
导出类型内省类型={
只读类型:“对象”;
};
导出类型内省ListTypeRef<
T扩展内省TypeRef=内省TypeRef
> = {
只读类:“列表”;
只读类型:T;
};
导出类型内省NonNullTypeRef<
T扩展内省TypeRef=内省TypeRef
> = {
只读类型:“非空”;
只读类型:T;
};
导出类型内省TypeRef=
|内省名称TypeRef
|内省ListTypeRef
|内省非NullTypeRef<
内省名称TypeRef |内省列表TypeRef
>;
导出类型内省NamedTypeRef<
T扩展内省类型=内省类型
> = {
只读种类:T['kind'];
};
在这种情况下,IntrospectionTypeRef
抛出一个循环引用错误,并将鼠标悬停在IntrospectionListTypeRef
或IntrospectionNonNullTypeRef
上,表示T extensed any=any
实际上不应该这样做。这里有什么问题吗
这是你的链接
注意:此代码来自graphql
,我们目前正在进行。
这是你的电话号码
我找到的解决办法有:
any
传递到内省ListTypeRef
。但这并不是一个理想的解决方案。看IntrospectionListTypeRef
和IntrospectionNonNullTypeRef
的泛型类型,然后它就可以工作了,但问题是还有一些类型,我们正在尝试以这种方式移植,这意味着我们正在复制类型- 泛型类和接口类型的实例化(例如
)Array
- 数组类型(例如
)Foo[]
- 元组类型(例如
)[string,Foo?]
Bar
是一个通用的类或接口时,类似type Foo=Bar
的内容才受此支持。不支持当条
本身是类型
别名时
这就是原因。另请参见开放功能请求,以解除此限制
那么,我能想象的最简单的修复方法就是尽可能地将您的类型
别名更改为接口
s。在示例代码中,只有IntrospectionTypeRef
本身需要保持类型
别名,因为它是联合类型。所有其他的都可以改变:
export interface IntrospectionType {
readonly kind: 'OBJECT';
};
export interface IntrospectionListTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> {
readonly kind: 'LIST';
readonly ofType: T;
};
export interface IntrospectionNonNullTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> {
readonly kind: 'NON_NULL';
readonly ofType: T;
};
export type IntrospectionTypeRef =
| IntrospectionNamedTypeRef
| IntrospectionListTypeRef
| IntrospectionNonNullTypeRef<
IntrospectionNamedTypeRef | IntrospectionListTypeRef
>;
export interface IntrospectionNamedTypeRef<
T extends IntrospectionType = IntrospectionType
> {
readonly kind: T['kind'];
};
export interface IntrospectionType {
readonly kind: 'OBJECT';
};
export interface IntrospectionListTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> {
readonly kind: 'LIST';
readonly ofType: T;
};
export interface IntrospectionNonNullTypeRef<
T extends IntrospectionTypeRef = IntrospectionTypeRef
> {
readonly kind: 'NON_NULL';
readonly ofType: T;
};
export type IntrospectionTypeRef =
| IntrospectionNamedTypeRef
| IntrospectionListTypeRef
| IntrospectionNonNullTypeRef<
IntrospectionNamedTypeRef | IntrospectionListTypeRef
>;
export interface IntrospectionNamedTypeRef<
T extends IntrospectionType = IntrospectionType
> {
readonly kind: T['kind'];
};
导出接口内省类型{
只读类型:“对象”;
};
导出接口内省ListTypeRef<
T扩展内省TypeRef=内省TypeRef
> {
只读类:“列表”;
只读类型:T;
};
导出接口内省NonNullTypeRef<
T扩展内省TypeRef=内省TypeRef
> {
只读类型:“非空”;
只读类型:T;
};
导出类型内省TypeRef=
|内省名称TypeRef
|内省ListTypeRef
|内省非NullTypeRef<
内省名称TypeRef |内省列表TypeRef
>;
导出接口内省NamedTypeRef<
T扩展内省类型=内省类型
> {
只读种类:T['kind'];
};
导出接口内省类型{
只读类型:“对象”;
};
导出接口内省ListTypeRef<
T扩展内省TypeRef=内省TypeRef
> {
只读类:“列表”;
只读类型:T;
};
导出接口内省NonNullTypeRef<
T扩展内省TypeRef=内省TypeRef
> {
只读类型:“非空”;
只读类型:T;
};
导出类型内省TypeRef=
|内省名称TypeRef
|内省ListTypeRef
|内省非NullTypeRef<
内省名称TypeRef |内省列表TypeRef
>;
导出接口内省NamedTypeRef<
T扩展内省类型=内省类型
> {
只读种类:T['kind'];
};
现在没有错误了,万岁