将接口类型分配给代码优先的 GraphQL 解析器参数

Posted

技术标签:

【中文标题】将接口类型分配给代码优先的 GraphQL 解析器参数【英文标题】:Assign interface type to code-first GraphQL resolver argument 【发布时间】:2021-06-28 23:43:08 【问题描述】:

以下代码优先的 GraphQL 架构示例取自 GraphQL 的 Constructing Types 页面。

// Define the Query type
var queryType = new graphql.GraphQLObjectType(
  name: 'Query',
  fields: 
    user: 
      type: userType,
      // `args` describes the arguments that the `user` query accepts
      args: 
        id:  type: graphql.GraphQLString 
      ,
      resolve: (_, id) => 
        return fakeDatabase[id];
      
    
  
);

虽然您可以定义 args 及其 GraphQL 类型(本例中为 GraphQLString),但解析器中的实际 id 属性具有“任何”类型。

我尝试将id 替换为id: id: string,但这引发了错误Type '(_: any, id : id: string; )' is not assignable to type 'GraphQLFieldResolver<any, any, [argName: string]: any; >'

虽然这是一个简单的“字符串”示例,但我的实际代码具有具有多个属性的更复杂的对象类型。确保引用正确的属性名称是解析器中缺少的其他地方的一大帮助。也许有一种方法可以告诉解析器 args 的实际类型,但我对 TypeScript 太陌生了,找不到它。

有没有办法定义/覆盖解析器参数的类型?

【问题讨论】:

【参考方案1】:

我相信您遇到了与this issue 中所述相同的问题。

一种解决方法是让您的id 属性为可选(通过将id 替换为id: id?: string)并在您引用它之前检查它在解析器中是否存在。

【讨论】:

谢谢!似乎此问题已于 2021 年 10 月修复,并且看起来包含在 graphql-js 库的 16.0.0 版本中。

以上是关于将接口类型分配给代码优先的 GraphQL 解析器参数的主要内容,如果未能解决你的问题,请参考以下文章

用于同一 Mongoose 集合上的接口的 GraphQL 解析器

如何将请求标头传递给 graphql 解析器

如何使用 graphql-tools 使用或解析枚举类型?

传递给解析器不是有效的 GraphQL DocumentNode。您可能需要使用“graphql-tag”或其他方法将您的操作转换为文档

使用 eslint 从 graphql 解析器返回啥严格的打字稿类型?

GraphQL Schema 未使用 NestJS 更新(代码优先方法)