web-dev-qa-db-fra.com

Un type d'entrée GraphQL peut-il hériter d'un autre type ou d'une autre interface?

Est-il possible d'utiliser l'héritage avec les types d'entrée GraphQL?

Quelque chose comme ça (cela, bien sûr, ne fonctionne pas avec les types d'entrée):

interface UserInputInterface {
  firstName: String
  lastName: String
}

input UserInput implements UserInputInterface {
  password: String!
}

input UserChangesInput implements UserInputInterface {
  id: ID!
  password: String
}
28
kyrisu

Non, la spécification ne permet pas aux types d'entrée d'implémenter des interfaces. Et le système de type GraphQL en général ne définit aucune forme d'héritage (le mot clé extends ajoute des champs à un type existant et n'est pas destiné à l'héritage). Même les interfaces ne peuvent pas hériter d'autres interfaces (bien que cela semble en raison du changement ). La spécification est volontairement contrainte de rester simple. Cela signifie que vous êtes bloqué en répétant des champs parmi les types d'entrée.

Cela dit, selon la façon dont vous construisez votre schéma, vous pouvez créer une sorte de transformateur de type qui ajoute les champs communs par programme en fonction de certaines métadonnées, par exemple une directive.

Mieux encore, vous pourriez être en mesure de résoudre votre problème via la composition (gardez toujours composition sur l'héritage à l'esprit). Par exemple.

input Name {
  firstName: String
  lastName: String
}

input UserInput {
  name: Name
  password: String!
}

input UserChangesInput {
  name: Name
  id: ID!
  password: String
}

Le client doit maintenant envoyer un objet un niveau plus profond, mais cela ne ressemble pas beaucoup à un prix pour éviter de gros morceaux répétitifs. Cela peut également être bon pour le client, car il peut désormais avoir une logique commune pour la construction des noms, quelle que soit la requête/mutation qui les utilise.

Dans cet exemple, où il ne s'agit que de 2 champs simples, cette approche est exagérée, mais en général - je dirais que c'est la voie à suivre.

17
kaqqao

À partir de la version stable de juin 2018 de la spécification GraphQL , un type d'objet d'entrée peut étendre un autre type d'objet d'entrée:

Les extensions de type d'objet d'entrée sont utilisées pour représenter un type d'objet d'entrée qui a été étendu à partir d'un type d'objet d'entrée d'origine.

Ce n'est pas un héritage en soi; vous pouvez uniquement étendre le type de base, pas créer de nouveaux types en fonction de celui-ci:

extend input MyInput {
  NewField: String
}

Notez qu'il n'y a pas de nom pour le nouveau type; le type MyInput existant est étendu.

L'implémentation de référence JavaScript a implémentation des extensions d'objet d'entrée dans GraphQL.js v14 (juin 2018), bien qu'il ne soit pas clair comment réellement passer les champs de saisie étendus à un query sans obtenir d'erreur.

Pour l'héritage de type réel, voir bibliothèque graphql-s2s .

3
Dan Dascalescu