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
}
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.
À 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 .