从 graphql-codegen 获取类似于 apollo codegen 生成的类型

Posted

技术标签:

【中文标题】从 graphql-codegen 获取类似于 apollo codegen 生成的类型【英文标题】:Getting types generated similar to apollo codegen from graphql-codegen 【发布时间】:2020-12-21 07:00:20 【问题描述】:

我是 apollo 和 graphql 的新手。我尝试同时使用 apollo-codegen 和 graphql-codegen 并且我希望在一个文件中生成所有类型,例如在 graphql-codegen 中,但在 apollo 中它会创建多个文件。

我在使用 graphql-codegen 时遇到的问题是生成的类型不是我获取数据的格式。

当使用 apollo 客户端 useQuery 时,我从后端获取的数据格式为

data: 
  queryName : ... actualDataObject 


所以 apollo -codegen 的示例查询的输出是:-

export interface Login_logIn 
  __typename: "UserPayload";
  email: string;
  firstname: string;
  lastname: string;


export interface Login 
  logIn: Login_logIn;  // logIn is the queryname here

但是使用 graphql-codegent 我得到的输出是:-

export type UserPayload = 
  __typename?: 'UserPayload';
  _id: Scalars['ID'];
  email: Scalars['String'];
  firstname: Scalars['String'];
  lastname: Scalars['String'];
;

是否可以像 apollo codegen 一样输出 graphql-codegen,即格式为:-

export type UserPayload 
  logIn :                      //logIn is the queryname
    __typename?: 'UserPayload';
    _id: Scalars['ID'];
    email: Scalars['String'];
    firstname: Scalars['String'];
    lastname: Scalars['String'];
 


让它在 useQuery 或 useMutation hook 中变得容易使用?通过使用 graphql-codegen

 const [doLogin, loading, error, data] = useMutation<UserPayload, UserInputVariables>(
    LOGIN,
    
      variables: 
        ...variables,
      
    ,
  );

【问题讨论】:

【参考方案1】:

您需要将typescript-operations 插件添加到您的codegen.yml

generates:
  types.ts:
    plugins:
      - typescript
      - typescript-operations

并确保您已将documents 属性设置为指向您的查询所在的位置。

这将为每个操作生成两种额外的类型——一种用于查询响应,一种用于变量——然后这两种类型都可以传递给您的钩子。

export type LoginMutationVariables = Exact< ... >;


export type LoginMutation = (
   __typename?: 'Mutation' 
  &  logIn: ... 
);

您可以查看有关插件here 的更多详细信息。如果您使用的是 Apollo,您可能会考虑使用 codegen 只是 generate the hooks for you。

【讨论】:

我没有使用 codegen 创建钩子,所以没有将文档属性添加到 codegen.yml。您的回答解决了问题并创建了我需要的类型.. 谢谢。

以上是关于从 graphql-codegen 获取类似于 apollo codegen 生成的类型的主要内容,如果未能解决你的问题,请参考以下文章

typescript 和 graphql-codegen 之间的枚举不匹配

Apollo Server:Eject 内置“上传”类型以使用 graphql-codegen 生成 TS 类型

@graphql-codegen 创建的 `Exact<T>` 类型的目的是啥?

如何在 typescript/javascript 导出中使用字符串模板来处理 graphql-codegen 架构

如何从结构类似于Java的XML文件中获取特定元素

在客户端解析器中导入类型时,如何避免使用 Apollo 客户端和“graphql-codegen”的角度项目中的循环依赖?