GraphQL规范List和NonNull澄清

时间:2017-01-24 15:40:12

标签: graphql

我在解释GraphQL规范的这一部分时遇到了一些麻烦。

https://facebook.github.io/graphql/#sec-Combining-List-and-Non-Null

1

  

如果List的修改类型是Non-Null,那么该List可能不是   包含任何空项。

2

  

如果Non-Null的修改类型是List,则不接受null,   但是接受一个空列表。

我假设这些的表示是

  1. 列出[类型!]
  2. 列表[类型]!
  3. 假设这很正确。

    第一个问题:对于1,规范没有明确说明空列表无效,是吗?

    graphql-js项目中的

    This test表明不应该这样做。

    如果是这样,规范中没有指定非空列表的内容?

    第二个问题:如果没有修饰符(1),我是否应该能够提交一个包含空值的List(如下所示)?

    List[Book]
    
    Book
    title: String!
    
    createBook(input: {books: [{null, {title: "Book a"}}]})
    
    无论修饰符是否存在,

    GraphiQL似乎都不允许向列表添加null。这会是GraphiQL中的错误吗?

1 个答案:

答案 0 :(得分:1)

你假设正确。有four possible combinations

[字符串]

null // valid
[] // valid
['a', 'b'] // valid
['a', null, 'b'] // valid

[字符串!]

null // valid
[] // valid
['a', 'b'] // valid
['a', null, 'b'] // invalid

[字符串]!

null // invalid
[] // valid
['a', 'b'] // valid
['a', null, 'b'] // valid

[字符串!]!

null // invalid
[] // valid
['a', 'b'] // valid
['a', null, 'b'] // invalid
  

第一个问题:对于1,规范没有明确说空列表是无效的,不是吗?

它没有必要。默认情况下,GraphQL中的所有类型都可以为空,包括列表。上面的第一个例子适用。

  

第二个问题:如果没有修饰符(1),我是否应该能够提交一个包含空值的List(如下所示)?

是。 GraphQL spec section 5.3.3表明参数必须与模式中定义的类型兼容。

但实际上,发送包含null元素的列表是没用的。这可能就是为什么GraphiQL不适合它。

附注:关于何时使用非可空类型,this article可以添加一些观点,说明为什么在GraphQL API中使用可空类型可能是一个不错的选择,即使字段不应该为空。