Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用递归类型别名会产生循环引用错误_Typescript_Graphql Js - Fatal编程技术网

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
    的泛型类型,然后它就可以工作了,但问题是还有一些类型,我们正在尝试以这种方式移植,这意味着我们正在复制类型
  • 还提出了一个问题,请参见

    TypeScript不允许任意循环类型定义。如果我们看一下,引入了对TypeScript 3.7的循环类型引用的支持的pull请求,它说:

    此PR所做的具体更改是,允许类型参数在以下类型的别名类型[大致上,在类型别名中]中进行循环引用:

    • 泛型类和接口类型的实例化(例如
      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'];
    };
    
    现在没有错误了,万岁