web-dev-qa-db-fra.com

Pouvez-vous créer un type graphql à la fois en entrée et en sortie?

J'ai quelques types d'objet que j'aimerais utiliser en entrée et en sortie, par exemple un type de devise ou un type de réservation.

Comment définir un schéma prenant en charge les types d’entrée et de sortie de mon schéma - je ne souhaite pas dupliquer le code si je n’ai pas à le faire. Je préférerais également ne pas créer de types d'entrée en double tels que des enumérations de devise et de statut.

export const ReservationInputType = new InputObjectType({
  name: 'Reservation',
  fields: {
    hotelId: { type: IntType },
    rooms: { type: new List(RoomType) },
    totalCost: { type: new NonNull(CurrencyType) },
    status: { type: new NonNull(ReservationStatusType) },
  },
});

export const ReservationType = new ObjectType({
  name: 'Reservation',
  fields: {
    hotelId: { type: IntType },
    rooms: { type: new List(RoomType) },
    totalCost: { type: new NonNull(CurrencyType) },
    status: { type: new NonNull(ReservationStatusType) },
  },
});
14
MonkeyBonkey

Dans la spécification GraphQL, les objets et les objets en entrée sont des choses distinctes. Citant la spécification pour les objets d'entrée :

Les champs peuvent définir des arguments que le client transmet avec la requête pour configurer leur comportement. Ces entrées peuvent être des chaînes ou des énumérations, mais elles doivent parfois être plus complexes que cela.

Le type d'objet ... n'est pas approprié pour être réutilisé ici, car les objets peuvent contenir des champs qui expriment des références circulaires ou des références à des interfaces et des unions, aucune des deux n'étant appropriée pour être utilisée comme argument d'entrée. Pour cette raison, les objets d'entrée ont un type distinct dans le système.

Un objet d'entrée définit un ensemble de champs d'entrée. les champs d'entrée sont des scalaires, des énumérations ou d'autres objets d'entrée. Cela permet aux arguments d'accepter des structures arbitrairement complexes.

Bien qu'une implémentation puisse fournir un code de commodité pour créer un objet et un objet d'entrée correspondant à partir d'une définition unique, sous la couverture, la spécification indique qu'ils devront être des éléments séparés (avec des noms distincts, tels que Reservation et ReservationInput).

13
CommonsWare

Vous pouvez faire quelque chose comme ça:

export const createTypes = ({name, fields}) => {
  return {
    inputType: new InputObjectType({name: `${name}InputType`, fields}),
    objectType: new ObjectType({name: `${name}ObjectType`, fields})
  };
};

const reservation = createTypes({
  name: "Reservation",
  fields: () => ({
    hotelId: { type: IntType },
    rooms: { type: new List(RoomType) },
    totalCost: { type: new NonNull(CurrencyType) },
    status: { type: new NonNull(ReservationStatusType) }
  })
});
// now you can use:
//  reservation.inputType
//  reservation.objectType

2
Pankaj Vishwani

c'est quelque chose que j'ai fait pour mon projet (ça marche bien):

const RelativeTemplate = name => {
  return {
    name: name,
    fields: () => ({
      name: { type: GraphQLString },
      reference: { type: GraphQLString }
    })
  };
};
const RelativeType = {
  input: new GraphQLInputObjectType(RelativeTemplate("RelativeInput")),
  output: new GraphQLObjectType(RelativeTemplate("RelativeOutput"))
};
0
AW_