3 minute read

Что означает [String!] в описании параметров GraphQL?

В GraphQL синтаксис [String!] имеет конкретное значение, связанное с типами данных. Разберём подробно:

Что означает [String!]?

  1. String

    Это базовый тип данных в GraphQL, который представляет строку.

  2. ! (восклицательный знак после String)

    Указывает, что значение не может быть null. То есть каждый элемент в массиве обязательно должен быть строкой, а null недопустим.

  3. [String!] (массив строк, где ! относится к элементам массива)

    Это массив, который:

    • Может содержать одну или несколько строк.
    • Не допускает null внутри массива.

    Пример допустимого значения:

    ["Hello", "World", "GraphQL"]
    

    Пример недопустимого значения:

    ["Hello", null, "GraphQL"] // Ошибка: null недопустим.
    
  4. [String!]! (добавлен ! для массива)

    Это более строгая версия:

    • Сам массив не может быть null.
    • Каждый элемент массива также не может быть null.

    Пример допустимого значения:

    ["Hello", "World"]
    

    Пример недопустимого значения:

    null               // Ошибка: массив не может быть null.
    ["Hello", null]    // Ошибка: элементы массива не могут быть null.
    

Сравнение разных вариантов:

Тип Значение массива Допустимо?
[String] null
  []
  ["Hello", null]
  ["Hello", "World"]
[String!] null
  []
  ["Hello", null]
  ["Hello", "World"]
[String!]! null
  []
  ["Hello", null]
  ["Hello", "World"]

Пример в GraphQL

Пример запроса с использованием [String!]!:

mutation CreateTags($tags: [String!]!) {
  createTags(input: { tags: $tags }) {
    id
    tags
  }
}

Пример переменной:

{
  "tags": ["tag1", "tag2", "tag3"]
}

Если переменной передать ["tag1", null] или null, сервер вернёт ошибку, так как это нарушает тип [String!].


1. Тип [String!] (Массив строк, элементы которого не могут быть null)

Если тип [String!] используется, то массив может быть null, но каждый элемент внутри этого массива не может быть null. Пример:

mutation CreateTags($tags: [String!]!) {
  createTags(input: { tags: $tags }) {
    id
    tags
  }
}

Объяснение:

  • tags: [String!]!:
    • Массив не может быть пустым (из-за восклицательного знака снаружи массива, то есть ! после массива).
    • Внутри массива нельзя использовать null значения, то есть элементы должны быть строками (по типу String!).

2. Тип [String!]! (Массив строк, элементы которого не могут быть null, и сам массив тоже не может быть null)

Пример с [String!]!:

mutation CreateTags($tags: [String!]!) {
  createTags(input: { tags: $tags }) {
    id
    tags
  }
}

Объяснение:

  • tags: [String!]!:
    • Массив не может быть null (из-за внешнего восклицательного знака).
    • Элементы внутри массива также не могут быть null (из-за восклицательного знака внутри массива).

Это значит, что:

  • Если передается null, запрос завершится ошибкой.
  • Если массив передан, но в нем есть null элементы, также будет ошибка.

Примеры для типа [String!]:

Допустимый запрос:

mutation CreateTags($tags: [String!]!) {
  createTags(input: { tags: ["tag1", "tag2"] }) {
    id
    tags
  }
}

Недопустимый запрос (с null элементом внутри массива):

graphql
CopyEdit
mutation CreateTags($tags: [String!]!) {
  createTags(input: { tags: ["tag1", null] }) {
    id
    tags
  }
}

Ошибка: элементы массива не могут быть null.

Допустимый запрос (с пустым массивом):

mutation CreateTags($tags: [String!]!) {
  createTags(input: { tags: [] }) {
    id
    tags
  }
}

Сравнение:

Тип Массив может быть null? Элементы могут быть null?
[String!]
[String!]!

Ещё объяснение [String!]!

Это типовая сигнатура из GraphQL, и она может выглядеть запутанно, особенно с этими восклицательными знаками. Давайте разберёмся пошагово:

🔹 alternateLocales: [String!]!

Это значит:

  • alternateLocales — поле (или аргумент), которое возвращает список строк.
  • [String!]!тип данных этого поля.

📘 Разбор [String!]! по частям:

Часть Значение
String тип строки (например, "en", "fr")
String! строка не может быть null
[String!] массив строк, в котором каждая строка обязана быть непустой
[String!]! сам массив тоже не может быть null, и элементы в нём — не null

✅ Пример

alternateLocales: ["en", "fr", "de"] 
alternateLocales: null   // нельзя, так как список не может быть null
alternateLocales: ["en", null, "de"]  // нельзя, так как элемент списка не может быть null

📌 Итого:

  • ! — означает “не может быть null”.
  • [String!]! — список непустых строк, и сам список тоже обязателен.

Если бы было, например:

  • String — может быть null
  • String! — обязательно строка, не null
  • [String] — массив, где могут быть null элементы
  • [String!] — массив, где элементы не null, но сам массив может быть null
  • [String]! — массив, где массив не null, но элементы могут быть null