# InterfaceType
A InterfaceType corresponds to the statement: interface with GraphQL (in SDL).
@InterfaceType()
class User {
@Field()
email: string;
@Field()
username: string;
}
Will give in SDL:
User interface {
email: String
username: String
}
# Parameters
@InterfaceType has several signatures available for setting up your object:
# name
Indicates the name of the type compiled in SDL.
# params
An object accepting several parameters:
| Property | description | type |
|---|---|---|
| hidden | The class will not be compiled and will not appear in the schema (useful for generic types), an abstract class is normally hidden | boolean |
| nullable | All fields of type will be nullable | boolean |
| required | All fields of the type will be required | boolean |
| typeResolver | Function determining the value of __typename | GraphQLTypeResolver |
| description | The description of the type | string |
| extensions | Extensions (metadata) of the type | any |
| directives | directives of the type | {name: string, args: KeyValue}[] |
| extends | Apply forced inheritance | (ClassType | ObjectType | InterfaceType | InputType)[] (A class or a type declared with graphql-composer)[] |
# @InterfaceField
The @InterfaceField decorator will show field parameters only for @InterfaceType.
This is useful when you use a class as several GraphQL types (``type,inputand/orinterface), decorating it simultaneously with@InterfaceTypeand@InputType` for example.
Because @Field sets the field for all GraphQL types whose class is decorated.
@InterfaceFieldoverrides the parameters of@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;
}
Will give in SDL:
User interface {
username: String;
name: String;
email: Thong;
}
input UserInput {
username: String!;
name: String!;
email: Thong;
password: String;
}
# The function of TypeResolver (__typename)
By default a function that works with all types is written by graphql-composer, so in many cases you don't need to give a value to params.typeResolver.
The default function determines the type via the object properties, but generally for any object. This also applies to
UnionType'. AGraphQLTypeResolver` function may look like this (in one specific case):
function typeResolver = (obj, context, info) => {
if(obj.name){
return "Author";
}
if(obj.title){
return "Book";
}
return null;
}
@InterfaceType({
typeResolver
})
class User {
Field()
username: string;
}
← InputType Union type →