Types
GraphQL types can be defined by placing a @gqlType
docblock directly before a:
- Class declaration
- Interface declaration
- Type alias of a literal type or
unknown
If model your GraphQL resolvers using classes, simply add a @gqlType
docblock
before the class containing that type's resolvers.
/** @gqlType */
class MyClass {
/** @gqlField */
someField: string;
}
If your types are represented in your code by TypeScript interfaces, simply add a
@gqlType
docblock before the interface representing that type. Note that by
using @gqlType
on an interface, Grats will treat it as a GraphQL type and not
an interface.
/** @gqlType */
export interface MyType {
/** @gqlField */
someField: string;
}
Finally, if your types are represented in your code by named types, simply add a
@gqlType
docblock before the type alias which describes that type.
/** @gqlType */
export type MyType = {
/** @gqlField */
someField: string;
};
Renaming Types
If you want to use a different name for your type in GraphQL than in your code, you can specify the name of the type in the @gqlType
docblock tag. See Renaming for more information.
/** @gqlType User */
class UserModel {
/** @gqlField */
someField: string;
}
Which would extract:
type User {
someField: String
}
Operation Types
The three operation types, Query
, Mutation
and Subscription
are special and must be defined as a type alias of of unknown
. E.g. type Query = unknown;
. If you attempt to define them any other way, Grats will report an error. You can read more in this FAQ entry: Why Prohibit Root Values.
Implementing Interfaces
Like GraphQL's schema definition language, each type which implements of an interface must manually define all the fields required by the interface with /** @gqlField */
tags. Grats will not automatically inherit the fields of the interface. If you omit any fields, or fail to match types correctly, Grats will report an error.
Classes
If you are using classes to model your GraphQL resolvers, you can define your types as implementing a GraphQL interface by declaring that your class implements
an interface which has been annotated with @gqlInterface
.
/** @gqlInterface */
interface Person {
/** @gqlField */
name: string;
}
/** @gqlType */
export class User implements Person {
/** @gqlField */
name: string;
}
Will generate the following GraphQL schema:
interface Person {
name: String
}
type User implements Person {
name: String
}
TypeScript Interface
If you are using interfaces to model your GraphQL resolvers, you can define your types as implementing a GraphQL interface by declaring that your class extends
an interface which has been annotated with @gqlInterface
.
/** @gqlInterface */
interface Person {
/** @gqlField */
name: string;
}
/** @gqlType */
export interface User extends Person {
__typename: "User";
/** @gqlField */
name: string;
}
Will generate the following GraphQL schema:
interface Person {
name: String
}
type User implements Person {
name: String
}
Type Alias
Types declared using a type alias may not implement a GraphQL interface. Instead, we recommend using a TypeScript interface to model your GraphQL type.
See Interfaces for more information about defining interfaces.
Grats must be able to determine the typename of any type which implements an interface. To achieve this Grats will validate that all implementors of an interface either define a __typename: "MyType" as const
property or are exported classes. Grats can use either to determin the typename at runtime.