Object types
Object types are main building block of any graphql schema. In typegql
- ObjectType
is equivalent to GraphQLObjectType
.
To define new object type, decorate any class with @ObjectType
decorator.
import { ObjectType } from 'typegql';
@ObjectType()
class MyType {
// fields will be defined here
}
Fields
Every ObjectType
must have at least one field. To create new field, decorate any property or method of ObjectType
class with @Field
decorator:
import { ObjectType, Field } from 'typegql';
@ObjectType()
class MyType {
@Field() foo: string;
@Field()
fooMethod(): string {
return 'fooMethodResult';
}
}
Nested Sub-types
To build nested structure of objects - every field can use another ObjectType
as it's type
import { ObjectType, Field } from 'typegql';
@ObjectType()
class Location {
constructor(lat: number, lng: number) {
this.lat = lat;
this.lng = lng;
}
@Field() lat: number;
@Field() lng: number;
}
@ObjectType()
class Restaurant {
@Field() name: string;
@Field()
location(): Location {
return new Location(50, 50);
}
}
Circular type references
In other to define circular references. Eg. car have owner, owner has cars which have owner. it's required to assign types in lazy way (with getter functions)
To do so, we'll use @Field
with type
option.
import { ObjectType, Field } from 'typegql';
@ObjectType()
class Car {
@Field({ type: () => Person })
owner() {
return db.findPersonByCarId(this.id);
}
@Field() id: number;
}
@ObjectType()
class Person {
@Field() id: number;
@Field() name: string;
@Field({ type: () => Car })
car() {
return db.findCarByOwnerId(this.id);
}
}