将接口类型分配给代码优先的 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 DocumentNode。您可能需要使用“graphql-tag”或其他方法将您的操作转换为文档