Типы соединений GraphQL в Woovi
GraphQL - это популярный язык запросов для API, который предоставляет гибкий и эффективный способ извлечения данных с сервера. Одной из ключевых особенностей GraphQL является возможность определять типы объединения, которые позволяют возвращать несколько типов объектов из одного поля. В этом посте мы подробнее рассмотрим типы объединения в GraphQL и то, как реализовать их в JavaScript с помощью GraphQL.js библиотека. Мы рассмотрим основы типов объединения, включая их определение и использование, а также рассмотрим реальные сценарии, в которых они могут быть применены для упрощения и повышения производительности вашего API. Являетесь ли вы опытным разработчиком GraphQL или только начинаете, этот пост предоставит ценную информацию о мощи и универсальности типов объединения.
Типы объединния
Типы объединения очень похожи на интерфейсы, но они не позволяют указывать какие-либо общие поля между типами.
Смотрите официальный документ, чтобы узнать больше об этой концепции.
Типы обхединений в коде GraphQL в первую очередь
При кодировании с помощью graphql-кода сначала вы можете объявить свой тип объединения, как показано ниже.
Для следующего примера давайте иметь в виду следующий сценарий:
- у нас есть поле массива, которое представляет собой массив способов оплаты
- этот способ оплаты может быть
CREDIT_CARD | DEBIT_CARD
- при сохранении способа оплаты каждый из них будет иметь свои собственные поля с одним общим:
method
- метод будет содержать тип способа оплаты
- method: 'CREDIT_CARD'
Union Type — подтипы
мы начинаем объявлять тип для каждого способа оплаты
export const PaymentMethodCreditCardType = new GraphQLObjectType({
name: 'PaymentMethodCreditCard',
fields: () => ({
method: {
type: new GraphQLNonNull(GraphQLString),
resolve: (paymentMethodCreditCard) => paymentMethodCreditCard.method,
},
}),
});
export const PaymentMethodDebitCardType = new GraphQLObjectType({
name: 'PaymentMethodDebitCard',
fields: () => ({
method: {
type: new GraphQLNonNull(GraphQLString),
resolve: (paymentMethodDebitCard) => paymentMethodDebitCard.method,
},
}),
});
Union Type - сам тип
затем мы объявляем тип объединения, который будет потреблять оба указанных выше типа:
export const PaymentMethodUnionType = new GraphQLUnionType({
name: 'PaymentMethodUnion',
description:
'Represents a generic payment method type (credit card | debit card)',
types: () => [PaymentMethodCreditCardType, PaymentMethodDebitCardType],
resolveType: (data: Record<string, unknown> | Record<string, unknown>) => {
if (data.method === 'CREDIT_CARD') {
return PaymentMethodCreditCardType.name;
}
if (data.method === 'DEBIT_CARD') {
return PaymentMethodDebitCardType.name;
}
return null;
},
});
примечание:
- resolveType получит значение, переданное от родителя
- поскольку поле представляет собой массив, это будут элементы массива
- мы сопоставляем их методом, ранее упомянутым выше
- затем укажите правильный тип
Union Type - Разоблачение
Мы предоставляем paymentMethods
как массив методов оплаты, использующих тип union.
paymentMethods: {
type: new GraphQLList(PaymentMethodUnionType),
resolve: (payment) => payment?.paymentMethods,
},
Union Type - Потребление его
Во фронтенде мы просто задаем его в graphql, например, в мутации, где устанавливаем для него выбранные способы оплаты и возвращаем заполненное поле:
const query = graphql`
mutation PaymentMethodAddMutation(
$input: PaymentMethodAddInput!
) {
PaymentMethodAdd(input: $input) {
error
payment
id
paymentMethods {
... on PaymentMethodCreditCard {
method
}
... on PaymentMethodDebitCard {
method
}
}
}
}
`;
Теперь у вас могут быть способы оплаты с определенными полями для каждого из них.
Woovi — это стартап, который позволяет покупателям платить по своему усмотрению. Чтобы сделать это возможным, Woovi предоставляет продавцам решения для мгновенных платежей, чтобы они могли принимать заказы.