输入 graphql 解析器函数

Posted

技术标签:

【中文标题】输入 graphql 解析器函数【英文标题】:Typing for graphql resolver function 【发布时间】:2020-07-30 11:14:47 【问题描述】:

查看了如何为柯里化函数编写类型的示例,但我仍然无法将两者联系起来。

这是我的解析器的功能

export default 
  Query:  
    Name: getResolver(‘name’, ‘special’)
  


function getResolver(n: string, type: string) 
   return (parent, args, ctx) =>  ... 

我尝试这样做,但它不起作用。

type GetResolver = <t, t1, t2>() => (parent: t...) => ... 

type NameResolver = (t, t1, t2)=> ...
type GetResolver = (...) => NameResolver

我知道这些类型是错误的,但我不确定这里缺少什么。

我们如何为 graphql 解析器函数编写类型?

【问题讨论】:

我编辑您的代码以采用更有意义的变量名称。现在您需要告诉我们更多关于getNameResolver(n, type)ntype 的参数它们代表什么?需要更多上下文来回答您的问题。 ntype 是我们用来定位特定数据的键。例如 loader[type][n] 检索一个值,并且对于每种类型,它返回不同的类型。例如 special 期望返回字符串,而 junk 期望返回数字 【参考方案1】:

正在进行中。等待 OP 的回应。

检查下面,我仍然没有得到完整的图片,需要更多的输入。尽管如此,我还是根据您的评论整理了这段代码。

interface NameParent 
interface NameArgs 

const resolvers = 
  name: 
    special: function (parent: NameParent, args: NameArgs, ctx: any) 
      return 'string'
    ,
    junk: function (parent: NameParent, args: NameArgs, ctx: any) 
      return 1
    
  


type ResolverType = keyof typeof resolvers

function getResolver<T extends ResolverType, K extends 'special' | 'junk'>(type: T, key: K) 
  return resolvers[type][key]


const specialNameResolver = getResolver('name', 'special')
// const specialNameResolver: (parent: NameParent, args: NameArgs, ctx: any) => string

const junkNameResolver = getResolver('name', 'junk')
// const junkNameResolver: (parent: NameParent, args: NameArgs, ctx: any) => number

【讨论】:

有没有一种可能的方法我将父类型排除在外,并让打字稿隐式分配它? 请提供更多上下文信息。您的实施非常具体。猜测您的意图,我无法正确回答。是的,也许你可以,但除了“是的,也许你可以”之外,我不知道如何/向你展示什么。

以上是关于输入 graphql 解析器函数的主要内容,如果未能解决你的问题,请参考以下文章

graphql中解析器函数的不同实现说明

在 graphql-yoga 中返回枚举的解析器函数是啥样的?

如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?

如何在 Apollo GraphQL 解析器的一个函数中解析 2 种不同的方法?

用 Jest 测试 GraphQL 解析器

Next JS api 路由类型为 graphql 错误(解析器不是函数)