Gernar
HTTP, API и сеть

Какие знаешь виды сущностей GraphQL схемы

Разбор вопроса «Какие знаешь виды сущностей GraphQL схемы» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Какие знаешь виды сущностей GraphQL схемы

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат понимает основные сущности GraphQL схемы и их назначение. Важно показать знание не только базовых типов (Query, Mutation), но и более продвинутых концепций, таких как интерфейсы, юнионы и директивы.

Ключевые тезисы

  • Типы (Types) — основные строительные блоки GraphQL схемы, описывающие структуру данных (например, User, Post).
  • Запросы (Queries) — определяют операции для получения данных (аналоги GET в REST).
  • Мутации (Mutations) — описывают операции для изменения данных (аналоги POST/PUT/DELETE в REST).
  • Подписки (Subscriptions) — позволяют получать обновления данных в реальном времени через WebSocket.
  • Интерфейсы (Interfaces) — абстрактные типы, которые определяют набор полей, которые должны быть реализованы другими типами.
  • Юнионы (Unions) — аналогичны интерфейсам, но не требуют общих полей, позволяя объединять разные типы.
  • Директивы (Directives) — инструменты для кастомизации выполнения запросов (например, @skip, @include).
  • Скалярные типы (Scalars) — примитивные типы данных (Int, String, Boolean и т.д.), включая возможность создания кастомных скаляров.

Подробный ответ

GraphQL схема состоит из нескольких ключевых сущностей, которые определяют структуру данных и операции с ними. Основные строительные блоки — это типы (Types), которые описывают структуру данных, например, User или Post. Запросы (Queries) позволяют получать данные, аналогично GET-запросам в REST. Мутации (Mutations) используются для изменения данных, подобно POST, PUT, DELETE в REST. Подписки (Subscriptions) обеспечивают получение обновлений в реальном времени через WebSocket. Интерфейсы (Interfaces) и юнионы (Unions) помогают создавать абстрактные типы и объединять разные типы данных. Директивы (Directives) позволяют кастомизировать выполнение запросов, а скалярные типы (Scalars) представляют примитивные данные, такие как Int, String, Boolean, и могут быть расширены кастомными скалярами.

Практические примеры

Пример 1

Пример определения типа (Type) в GraphQL схеме:

type User {
  id: ID!
  name: String!
  email: String!
  posts: [Post!]!
}

Здесь определен тип User с обязательными полями id, name, email и списком постов.

Пример 2

Пример подписки (Subscription):

type Subscription {
  newPost: Post!
}

Эта подписка позволяет клиенту получать уведомления о новых постах в реальном времени.

Пример 3

Пример интерфейса (Interface):

interface Node {
  id: ID!
}

type User implements Node {
  id: ID!
  name: String!
}

Интерфейс Node требует, чтобы все типы, которые его реализуют, имели поле id.

Частые ошибки

  • Путаница между интерфейсами (Interfaces) и юнионами (Unions). Интерфейсы требуют общих полей, а юнионы просто объединяют типы без обязательных полей.
  • Игнорирование использования директив (Directives) для оптимизации запросов, например, @skip или @include для условного получения данных.

Связанные темы

  • REST API и его сравнение с GraphQL
  • Работа с WebSocket для реализации подписок (Subscriptions)
  • TypeScript и его интеграция с GraphQL для типизации запросов и мутаций

Follow-up вопросы

Можешь привести пример определения типа (Type) в GraphQL схеме?

Уровень: basic

Пример определения типа User в GraphQL: type User { id: ID!, name: String!, email: String! }. Здесь User — это тип с обязательными полями id, name и email (восклицательный знак обозначает non-nullable).

Как работают подписки (Subscriptions) в GraphQL и чем они отличаются от запросов?

Уровень: intermediate

Подписки в GraphQL позволяют получать данные в реальном времени через WebSocket. В отличие от запросов (Queries), которые выполняются один раз, подписки остаются активными и отправляют обновления при изменениях данных на сервере.

Зачем нужны интерфейсы (Interfaces) в GraphQL и как их использовать?

Уровень: intermediate

Интерфейсы в GraphQL — это абстрактные типы, которые определяют набор обязательных полей для других типов. Например, интерфейс Node с полем id: ID! может быть реализован типами User и Post, обеспечивая единообразие структуры.

Как создать кастомный скалярный тип (Scalar) в GraphQL?

Уровень: advanced

Кастомный скалярный тип создается путем его объявления в схеме (например, scalar DateTime) и реализации логики парсинга/сериализации на сервере. Например, DateTime может представлять дату в формате ISO-8601.

В чем разница между юнионами (Unions) и интерфейсами (Interfaces)?

Уровень: advanced

Юнионы позволяют объединять разные типы без общих полей (например, union SearchResult = User | Post), тогда как интерфейсы требуют реализации определенных полей. Юнионы полезны, когда типы не связаны общей структурой.

Содержание