graphql/type
The graphql/type module is responsible for defining GraphQL types and schema.
You can import either from the graphql/type module, or from the root graphql
module. For example:
import { GraphQLSchema } from "graphql" // ES6
var { GraphQLSchema } = require("graphql") // CommonJSOverview
Schema
Definitions
class GraphQLScalarTypeA scalar type within GraphQL.class GraphQLObjectTypeAn object type within GraphQL that contains fields.class GraphQLInterfaceTypeAn interface type within GraphQL that defines fields implementations will contain.class GraphQLUnionTypeA union type within GraphQL that defines a list of implementations.class GraphQLEnumTypeAn enum type within GraphQL that defines a list of valid values.class GraphQLInputObjectTypeAn input object type within GraphQL that represents structured inputs.class GraphQLListA type wrapper around other types that represents a list of those types.class GraphQLNonNullA type wrapper around other types that represents a non-null version of those types.
Predicates
function isInputTypeReturns if a type can be used as input types for arguments and directives.function isOutputTypeReturns if a type can be used as output types as the result of fields.function isLeafTypeReturns if a type can be a leaf value in a response.function isCompositeTypeReturns if a type can be the parent context of a selection set.function isAbstractTypeReturns if a type is a combination of object types.
Un-modifiers
function getNullableTypeStrips any non-null wrappers from a type.function getNamedTypeStrips any non-null or list wrappers from a type.
Scalars
var GraphQLIntA scalar type representing integers.var GraphQLFloatA scalar type representing floats.var GraphQLStringA scalar type representing strings.var GraphQLBooleanA scalar type representing booleans.var GraphQLIDA scalar type representing IDs.
Schema
GraphQLSchema
class GraphQLSchema {
constructor(config: GraphQLSchemaConfig)
}
type GraphQLSchemaConfig = {
query: GraphQLObjectType
mutation?: GraphQLObjectType
}A Schema is created by supplying the root types of each type of operation, query and mutation (optional). A schema definition is then supplied to the validator and executor.
Example
var MyAppSchema = new GraphQLSchema({
query: MyAppQueryRootType,
mutation: MyAppMutationRootType
})Definitions
GraphQLScalarType
class GraphQLScalarType<InternalType> {
constructor(config: GraphQLScalarTypeConfig<InternalType>)
}
type GraphQLScalarTypeConfig<InternalType> = {
name: string
description?: string
serialize: (value: mixed) => InternalType
parseValue?: (value: mixed) => InternalType
parseLiteral?: (valueAST: Value) => InternalType
}The leaf values of any request and input values to arguments are Scalars (or Enums) and are defined with a name and a series of serialization functions used to ensure validity.
Example
var OddType = new GraphQLScalarType({
name: "Odd",
serialize: oddValue,
parseValue: oddValue,
parseLiteral(ast) {
if (ast.kind === Kind.INT) {
return oddValue(parseInt(ast.value, 10))
}
return null
}
})
function oddValue(value) {
return value % 2 === 1 ? value : null
}GraphQLObjectType
class GraphQLObjectType {
constructor(config: GraphQLObjectTypeConfig)
}
type GraphQLObjectTypeConfig = {
name: string
interfaces?: GraphQLInterfacesThunk | GraphQLInterfaceType[]
fields: GraphQLFieldConfigMapThunk | GraphQLFieldConfigMap
isTypeOf?: (value: any, info?: GraphQLResolveInfo) => boolean
description?: string
}
type GraphQLInterfacesThunk = () => Array<GraphQLInterfaceType>
type GraphQLFieldConfigMapThunk = () => GraphQLFieldConfigMap
// See below about resolver functions.
type GraphQLFieldResolveFn = (
source?: any,
args?: { [argName: string]: any },
context?: any,
info?: GraphQLResolveInfo
) => any
type GraphQLResolveInfo = {
fieldName: string
fieldNodes: Array<Field>
returnType: GraphQLOutputType
parentType: GraphQLCompositeType
schema: GraphQLSchema
fragments: { [fragmentName: string]: FragmentDefinition }
rootValue: any
operation: OperationDefinition
variableValues: { [variableName: string]: any }
}
type GraphQLFieldConfig = {
type: GraphQLOutputType
args?: GraphQLFieldConfigArgumentMap
resolve?: GraphQLFieldResolveFn
deprecationReason?: string
description?: string
}
type GraphQLFieldConfigArgumentMap = {
[argName: string]: GraphQLArgumentConfig
}
type GraphQLArgumentConfig = {
type: GraphQLInputType
defaultValue?: any
description?: string
}
type GraphQLFieldConfigMap = {
[fieldName: string]: GraphQLFieldConfig
}Almost all of the GraphQL types you define will be object types. Object types have a name, but most importantly describe their fields.
When two types need to refer to each other, or a type needs to refer to itself in a field, you can use a function expression (aka a closure or a thunk) to supply the fields lazily.
Note that resolver functions are provided the source object as the first
parameter. However, if a resolver function is not provided, then the default
resolver is used, which looks for a method on source of the same name as the
field. If found, the method is called with (args, context, info). Since it is
a method on source, that value can always be referenced with this.
Examples
var AddressType = new GraphQLObjectType({
name: "Address",
fields: {
street: { type: GraphQLString },
number: { type: GraphQLInt },
formatted: {
type: GraphQLString,
resolve(obj) {
return obj.number + " " + obj.street
}
}
}
})
var PersonType = new GraphQLObjectType({
name: "Person",
fields: () => ({
name: { type: GraphQLString },
bestFriend: { type: PersonType }
})
})GraphQLInterfaceType
class GraphQLInterfaceType {
constructor(config: GraphQLInterfaceTypeConfig)
}
type GraphQLInterfaceTypeConfig = {
name: string
fields: GraphQLFieldConfigMapThunk | GraphQLFieldConfigMap
resolveType?: (value: any, info?: GraphQLResolveInfo) => GraphQLObjectType
description?: string
}When a field can return one of a heterogeneous set of types, a Interface type is used to describe what types are possible, what fields are in common across all types, as well as a function to determine which type is actually used when the field is resolved.
Example
var EntityType = new GraphQLInterfaceType({
name: "Entity",
fields: {
name: { type: GraphQLString }
}
})GraphQLUnionType
class GraphQLUnionType {
constructor(config: GraphQLUnionTypeConfig)
}
type GraphQLUnionTypeConfig = {
name: string
types: GraphQLObjectsThunk | GraphQLObjectType[]
resolveType?: (value: any, info?: GraphQLResolveInfo) => GraphQLObjectType
description?: string
}
type GraphQLObjectsThunk = () => GraphQLObjectType[]When a field can return one of a heterogeneous set of types, a Union type is used to describe what types are possible as well as providing a function to determine which type is actually used when the field is resolved.
Example
var PetType = new GraphQLUnionType({
name: "Pet",
types: [DogType, CatType],
resolveType(value) {
if (value instanceof Dog) {
return DogType
}
if (value instanceof Cat) {
return CatType
}
}
})GraphQLEnumType
class GraphQLEnumType {
constructor(config: GraphQLEnumTypeConfig)
}
type GraphQLEnumTypeConfig = {
name: string
values: GraphQLEnumValueConfigMap
description?: string
}
type GraphQLEnumValueConfigMap = {
[valueName: string]: GraphQLEnumValueConfig
}
type GraphQLEnumValueConfig = {
value?: any
deprecationReason?: string
description?: string
}
type GraphQLEnumValueDefinition = {
name: string
value?: any
deprecationReason?: string
description?: string
}Some leaf values of requests and input values are Enums. GraphQL serializes Enum values as strings, however internally Enums can be represented by any kind of type, often integers.
Note: If a value is not provided in a definition, the name of the enum value will be used as its internal value.
Example
var RGBType = new GraphQLEnumType({
name: "RGB",
values: {
RED: { value: 0 },
GREEN: { value: 1 },
BLUE: { value: 2 }
}
})GraphQLInputObjectType
class GraphQLInputObjectType {
constructor(config: GraphQLInputObjectConfig)
}
type GraphQLInputObjectConfig = {
name: string
fields:
| GraphQLInputObjectConfigFieldMapThunk
| GraphQLInputObjectConfigFieldMap
description?: string
}
type GraphQLInputObjectConfigFieldMapThunk =
() => GraphQLInputObjectConfigFieldMap
type GraphQLInputObjectFieldConfig = {
type: GraphQLInputType
defaultValue?: any
description?: string
}
type GraphQLInputObjectConfigFieldMap = {
[fieldName: string]: GraphQLInputObjectFieldConfig
}
type GraphQLInputObjectField = {
name: string
type: GraphQLInputType
defaultValue?: any
description?: string
}
type GraphQLInputObjectFieldMap = {
[fieldName: string]: GraphQLInputObjectField
}An input object defines a structured collection of fields which may be supplied to a field argument.
Using NonNull will ensure that a value must be provided by the query
Example
var GeoPoint = new GraphQLInputObjectType({
name: "GeoPoint",
fields: {
lat: { type: new GraphQLNonNull(GraphQLFloat) },
lon: { type: new GraphQLNonNull(GraphQLFloat) },
alt: { type: GraphQLFloat, defaultValue: 0 }
}
})GraphQLList
class GraphQLList {
constructor(type: GraphQLType)
}A list is a kind of type marker, a wrapping type which points to another type. Lists are often created within the context of defining the fields of an object type.
Example
var PersonType = new GraphQLObjectType({
name: "Person",
fields: () => ({
parents: { type: new GraphQLList(PersonType) },
children: { type: new GraphQLList(PersonType) }
})
})GraphQLNonNull
class GraphQLNonNull {
constructor(type: GraphQLType)
}A non-null is a kind of type marker, a wrapping type which points to another type. Non-null types enforce that their values are never null and can ensure an error is raised if this ever occurs during a request. It is useful for fields which you can make a strong guarantee on non-nullability, for example usually the id field of a database row will never be null.
Example
var RowType = new GraphQLObjectType({
name: "Row",
fields: () => ({
id: { type: new GraphQLNonNull(String) }
})
})Predicates
isInputType
function isInputType(type: GraphQLType): booleanThese types may be used as input types for arguments and directives.
isOutputType
function isOutputType(type: GraphQLType): booleanThese types may be used as output types as the result of fields
isLeafType
function isLeafType(type: GraphQLType): booleanThese types may describe types which may be leaf values
isCompositeType
function isCompositeType(type: GraphQLType): booleanThese types may describe the parent context of a selection set
isAbstractType
function isAbstractType(type: GraphQLType): booleanThese types may describe a combination of object types
Un-modifiers
getNullableType
function getNullableType(type: GraphQLType): GraphQLNullableTypeIf a given type is non-nullable, this strips the non-nullability and returns the underlying type.
getNamedType
function getNamedType(type: GraphQLType): GraphQLNamedTypeIf a given type is non-nullable or a list, this repeated strips the non-nullability and list wrappers and returns the underlying type.
Scalars
GraphQLInt
let GraphQLInt: GraphQLScalarTypeA GraphQLScalarType that represents an int.
GraphQLFloat
let GraphQLFloat: GraphQLScalarTypeA GraphQLScalarType that represents a float.
GraphQLString
let GraphQLString: GraphQLScalarTypeA GraphQLScalarType that represents a string.
GraphQLBoolean
let GraphQLBoolean: GraphQLScalarTypeA GraphQLScalarType that represents a boolean.
GraphQLID
let GraphQLID: GraphQLScalarTypeA GraphQLScalarType that represents an ID.