当前位置: 首页 > 知识库问答 >
问题:

在GraphQL中输入类型的意义是什么?

谭煜
2023-03-14
type Sample {
  id: String
  name: String
}

input SampleInput {
  name: String
}

type RootMutation {
  addSample(sample: Sample): Sample  # <-- instead of it should be
  addSample(sample: SampleInput): Sample
}

共有1个答案

谷奕
2023-03-14

根据规范:

GraphQL对象类型(ObjectTypeDefinition)...不适合[作为输入]重用,因为对象类型可以包含定义参数的字段,也可以包含对接口和联合的引用,而这两个字段都不适合用作输入参数。由于这个原因,输入对象在系统中有一个单独的类型。

这是“官方原因”,但有几个实际原因说明为什么不能将对象类型用作输入对象类型或将对象类型用作输入对象类型:

type Student {
  name: String
  grade: Grade
}

input StudentInput {
  name: String
  grade: Grade
}
type Student {
  name(preferred: Boolean): String
  grade: Grade
}

input StudentInput {
  name: String
  grade: Grade = F
}
type Student {
  firstName: String
  lastName: String
  grade: Grade
}

input StudentInput {
  firstName: String
  lastName: String
  grade: Grade
}
type Student {
  fullName: String!
  classes: [Class!]!
  address: Address!
  emergencyContact: Contact
  # etc
}

虽然这些结构可以转换成适当的输入(我们创建了一个学生,因此我们也传递了一个表示他们地址的对象),但它们通常不是这样的--也就是说,也许我们需要通过类ID和节ID来指定学生的类,而不是对象。类似地,我们可能有想要返回但不想变异的字段,反之亦然(如password字段)。

而且,即使是相对简单的实体,我们也常常在对象类型和它们的“对应物”输入对象之间围绕可为空性有不同的要求。我们通常希望保证一个字段也会在响应中返回,但我们不希望在输入中要求相同的字段。例如,

type Student {
  firstName: String!
  lastName: String!
}

input StudentInput {
  firstName: String
  lastName: String
}

最后,在许多模式中,给定实体的对象类型和输入对象类型之间通常没有一对一的映射。一种常见的模式是为不同的操作使用单独的输入对象类型,以进一步微调模式级的输入验证:

input CreateUserInput {
  firstName: String!
  lastName: String!
  email: String!
  password: String!
}

input UpdateUserInput {
  email: String
  password: String
}
 类似资料:
  • 在这段代码中: 为什么我们需要?那是类型铸造,对吗? 假设赋值语句右侧的是大写字母。我想我们在做Unicode的加法和减法。 这是我正在阅读的Java书籍中的片段: 对char执行算术时,首先将其转换为在Unicode系统中表示它的int。从变量c中减去“A”本质上是问“c中的字符在大写字母中有多远?”然后,添加'a'将产生int,该int与小写字母字符代码序列的距离相同。之所以需要转换为char

  • 我使用laravel-graphql作为后端GraphQL服务,使用vue-apollo作为前端客户端。 在我的Vue组件中,我有一个gql查询,如下所示:(关系:一首歌有更多的歌曲部分) 现在有一个突变,我想用它来更新给定的歌曲:

  • 我正在学习Apollo和graphQL,并将其集成到我的一个项目中。到目前为止一切正常,但现在我正在尝试一些突变,我正在努力处理输入类型和查询类型。我觉得事情比实际情况要复杂得多,因此我正在寻求如何处理我的情况的建议。我在网上找到的示例都是非常基本的模式,但现实总是更加复杂,因为我的模式非常大,如下所示(我只复制一部分): 然后定义输入和负载,依此类推... 为此,我需要一个变异来保存“计算”,因

  • 问题内容: 我正在读一本关于Java的书,它说您可以将整个类声明为final。我想不出我会在哪里使用它。 我只是编程的新手,我想知道程序员是否真的在他们的程序上使用了它。如果他们这样做了,他们什么时候使用它,以便我可以更好地理解它,并知道何时使用它。 如果Java是面向对象的,并且您声明了一个类final,它是否会停止具有对象特征的类的想法? 问题答案: 如果他们这样做了,他们什么时候使用它,以便

  • 是否可以指定GraphQL中的字段应该是黑盒,就像Flow具有“any”类型一样?我的模式中有一个字段,它应该能够接受任何任意值,可以是字符串、布尔值、对象、数组等。

  • 在Java中解析类型是什么意思? 下面是一些用法示例,我试图理解它们: 从: 如果基础字段的类型是类型变量或参数化类型,则创建它。否则,它被解决。 需要创建类型变量或参数化类型才能使这种形式的反射工作,因为它们无法加载,因为它们在运行时并不真正“存在” 所以,如果某个东西在运行时存在,它可以被“解决”?通过类加载器 从: 根据此类型所表示的类型上下文解析给定的类型。例如: 这个我一点也不明白。不确