Синтаксис скалярных типов
Что означает [String!] в описании параметров GraphQL?
В GraphQL синтаксис [String!] имеет конкретное значение, связанное с типами данных. Разберём подробно:
Что означает [String!]?
-
StringЭто базовый тип данных в GraphQL, который представляет строку.
-
!(восклицательный знак послеString)Указывает, что значение не может быть null. То есть каждый элемент в массиве обязательно должен быть строкой, а
nullнедопустим. -
[String!](массив строк, где!относится к элементам массива)Это массив, который:
- Может содержать одну или несколько строк.
- Не допускает null внутри массива.
Пример допустимого значения:
["Hello", "World", "GraphQL"]Пример недопустимого значения:
["Hello", null, "GraphQL"] // Ошибка: null недопустим. -
[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— может бытьnullString!— обязательно строка, неnull[String]— массив, где могут бытьnullэлементы[String!]— массив, где элементы неnull, но сам массив может бытьnull[String]!— массив, где массив неnull, но элементы могут бытьnull