GraphQL类型:什么是正确的存储桶?

时间:2018-11-09 11:11:16

标签: javascript graphql

正式的graphql指南和howtographql教程都没有指定一致的存储/类型层次结构。

来自Official "Learn" GraphQL

  

GraphQL模式的最基本组成部分是对象类型

     

...

     

模式中的大多数类型将只是普通的对象类型,但是模式中有两种特殊的类型:查询,突变。 [我的笔记:他们在这里忘记了订阅]

     

...

     

除了作为架构的“入口点”之外,Query和Mutation类型与任何其他GraphQL对象类型相同,并且它们的字段完全一样地工作

     

...

     

这就是标量类型出现的地方:它们代表查询的叶子

     

...

     

枚举类型是一种特殊的标量

     

...

     

对象类型,标量和枚举是您可以在GraphQL中定义的唯一类型。 [我的笔记:这并不完全正确,因为枚举是特殊的标量类型]

     

...

     

接口是抽象类型

     

...

     

联合类型与界面非常相似

     

...

     

输入类型看起来与常规对象类型完全相同,但是关键字输入而不是类型

来自HowToGraphQL

  

在GraphQL中,有两种不同类型的类型。

     
      
  • 标量类型

  •   
  • 对象类型

  •   
     

...

     

枚举是特殊的标量类型。

     

...

     

可以使用接口以抽象方式描述类型。

     

...

     

联盟类型可以用来表示一个类型应该是其他类型的集合中的一个。

我的最佳猜测

  • 在GraphQL中仅存在两种类型:
    • 对象类型
    • 标量类型
  • 对象类型包括
    • 自定义对象类型
    • 3种特殊对象类型:查询,变异,订阅
  • 标量类型包括
    • 5种内置标量类型
    • 自定义标量类型
    • 枚举类型
  • 接口和联合
    • 这些实际上不是 类型
    • 它们是用于描述对象类型的机制
  • 输入类型
    • 再次,实际上不是类型
    • 这是一种可以将对象和标量类型用作查询输入的机制

问题

是否有正确的(官方)存储桶?我上面的“最佳猜测”正确吗?

1 个答案:

答案 0 :(得分:1)

GraphQL有一个specification,它详细描述了类型系统。我会仔细阅读该规范,因为它可能还会回答您对GraphQL的其他问题。您应该以其他网站的陈述为准,因为这可能是完全错误的,使用了不正确的术语或过分简化(以免使GraphQL的新读者不知所措)。

  

任何GraphQL模式的基本单位都是类型。 GraphQL中有六种命名类型定义,以及两种包装类型。

     

最基本的类型是标量。标量表示原始值,例如字符串或整数。通常,标量字段的可能响应是可枚举的。在这种情况下,GraphQL提供一个Enum类型,该类型指定有效响应的空间。

     

标量和枚举构成响应树中的叶子;中间层是对象类型,它们定义了一组字段,其中每个字段是系统中的另一种类型,从而允许定义任意类型的层次结构。

     

GraphQL支持两种抽象类型:接口和联合。

     

接口定义字段列表;保证实现该接口的对象类型可以实现那些字段。每当类型系统声明它将返回一个接口时,它将返回一个有效的实现类型。

     

联合定义了可能类型的列表;与接口类似,只要类型系统要求返回联合,就将返回其中一种可能的类型。

     

最后,通常提供复杂的结构作为GraphQL字段参数或变量的输入很有用;输入对象类型允许模式准确定义期望的数据。

规范中提到的两种包装器类型-ListNon-Null将在后面描述。 List是“一种特殊的集合类型,它声明列表中每个项目的类型”,而Non-Null则包装一个现有的类型并使null为无效响应(默认情况下,所有类型都可以为null)。

该规范还描述了root operation types。共有三种根操作类型-querymutationsubscription。仅需要query。这些本身不是单独的类型,而是模式定义的有效指向其他某种类型的部分。这三个都必须是对象类型。

schema {
  query: Foo
}

type Foo {
  someField: String
}