# InterfaceType

Un InterfaceType correspond à la déclaration: interface avec GraphQL (en SDL)

@InterfaceType()
class User {
  @Field()
  email: string;

  @Field()
  username: string;
}

Donnera en SDL:

interface User {
  email: String
  username: String
}

# Paramètres

@InterfaceType a plusieurs signatures disponibles permettant de paramétrer votre objet:

# name

Indique le nom du type compilé en SDL.

# params

Un objet acceptant plusieurs paramètres:

Propriété description type
hidden La classe ne sera pas compilée et n'apparaîtra pas dans le schéma (utile pour les types génériques), une classe abstraite est en principe hidden boolean
nullable Tous les champs du type seront nullable boolean
required Tous les champs du type seront requis boolean
typeResolver Fonction déterminant la valeur de __typename GraphQLTypeResolver
description La description du type string
extensions Les extensions (métadonnées) du type any
directives Les directives du type {name: string, args: KeyValue}[]
extends Appliquer l'héritage de façon forcé (ClassType | ObjectType | InterfaceType | InputType)[] (Une class ou un type déclaré avec graphql-composer)[]

# @InterfaceField

Le décorateur @InterfaceField va indiquer les paramètres du champ seulement pour @InterfaceType.

Ceci est utile lorsque vous utiliser une class en tant que que plusieurs types GraphQL (type, input ou/et interface), en la décorant simultanément de @InterfaceType et @InputType par exemple.

Car @Field paramètre le champ pour tous les types GraphQL dont la class est décorée.

@InterfaceField override les paramètres de @Field.

@InterfaceField()
@InputType("UserInput")
class User {
  @Field(type => R(String))
  @InterfaceField()
  username: string;

  @InputField(type => R(String))
  @InterfaceField()
  name: string;

  @Field()
  email: string;

  @InputField()
  password: string;
}

Donnera en SDL:

interface User {
  username: String;
  name: String;
  email: String;
}

input UserInput {
  username: String!;
  name: String!;
  email: String;
  password: String;
}

# La fonction de TypeResolver (__typename)

Par défaut une fonction fonctionnant avec tous les types est écrite par graphql-composer, vous n'avez donc, pour de nombreux cas, pas besoin de donner une valeur à params.typeResolver.

La fonction par défaut détermine le type via les propriétés de l'objet, mais de façon générale pour n'importe quel objet. Ceci s'applique également pour les UnionType. Une fonctionGraphQLTypeResolver` peut ressembler à ça (dans un cas spécifique):

function typeResolver = (obj, context, info) => {
  if(obj.name){
    return "Author";
  }

  if(obj.title){
    return "Book";
  }

  return null;
}

@InterfaceType({
  typeResolver
})
class User {
  Field()
  username: string;
}