Skip to content

Latest commit

 

History

History
90 lines (68 loc) · 1.71 KB

object-type-and-field.md

File metadata and controls

90 lines (68 loc) · 1.71 KB

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);
  }
}