如何获取带有变量的graphql查询标签的打字稿定义?

Posted

技术标签:

【中文标题】如何获取带有变量的graphql查询标签的打字稿定义?【英文标题】:How to get typescript definitions for graphql query tag with variables? 【发布时间】:2019-12-17 06:42:00 【问题描述】:

我正在尝试通过 apollo-cli (https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output) 为我的 graphql 标记查询生成打字稿定义。而且它们不会为模板字符串中$ 中的变量生成查询。有什么办法让它工作吗?

对于标记功能,我使用的是自定义模块 (gqutils)。我在选项中将标签设置为$gql.tag。它成功地为查询生成类型,其中没有任何变量。

我尝试寻找一种方法来提供自定义解析器,这样我就可以执行模板字符串并获取原始值。在 apollo 客户端中是否有与 custom document loader 等效的内容。

这是代码sn-p:

const docType = 
    PRODUCT: 'Product',
;

const query = $gql.tag`
  query searchProducts (
    $categoryId: IntID,
  )
    searchProducts(categoryId: $categoryId, docType: $docType.PRODUCT) 
      totalCount
      nodes 
        id,
        name,
      
  `;

apollo cli 不会产生任何错误,只是默默地忽略类型输出中的文件。

【问题讨论】:

【参考方案1】:

我猜,因为 Apollo-cli 从 GraphQL 模式生成类型,并且您在其中放入了一个变量,它不会转换为 graphql 类型 docType: $docType.PRODUCT 它无法解析它。 如果 doctype 是 graphql 枚举,则不需要为它创建特定的字符串对象。

考虑一下:

""" graphql schema enum """
enum DocTypes 
PRODUCT
...

// the frontend query
const query = gql `
  query searchProducts (
    $categoryId: IntID,
    $docType: DocTypes
  )
    searchProducts(categoryId: $categoryId, docType: $docType) 
      totalCount
      nodes 
        id,
        name,
      
  
`

在上述查询中,您可以将 docType 枚举放入查询变量中。

当 apollo CLI 现在运行时,它也会从 graphql 模式枚举中在前端生成所需的枚举。

作为一般经验法则,我建议不要将计算值放入您的 graphql 查询字符串中,因为这些对于任何 graphql 集成工具都难以解析。

【讨论】:

我不知道为什么我没有想到在变量中传递枚举,即使我现在将其他所有内容都作为变量传递。这将解决这种情况。谢谢! 所以如果想要生成类型,标准是使用静态字符串进行查询?

以上是关于如何获取带有变量的graphql查询标签的打字稿定义?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?

使用数组作为 GraphQL 查询的变量

当这些变量被删除时,如何停止获取所需导出变量的 Apollo GraphQL 查询

带有打字稿的graphql - @FieldResolver 在compiled-to-js type-graphql 中不起作用

带有graphql-request的SWR如何在swr中添加变量?

处理带有变量的 Graphql 查询时,Python 请求抛出 400