Skip to content

Latest commit

 

History

History
131 lines (117 loc) · 2.96 KB

File metadata and controls

131 lines (117 loc) · 2.96 KB

extend_interface/addStringFieldToInterfaceImplementedByInterface.ts

Input

/** @gqlField */
export function greeting(thing: IThing): string {
  return `Hello ${thing.name}!`;
}

/** @gqlInterface */
interface IThing {
  name: string;
  // Should have greeting added
}

/**
 * @gqlInterface
 */
interface IPerson extends IThing {
  name: string;
  // Should have greeting added
}

/** @gqlType */
class User implements IPerson, IThing {
  __typename: "User";
  name: string;
  // Should have greeting added
}

/** @gqlType */
class Admin implements IPerson, IThing {
  __typename: "Admin";
  name: string;
  // Should have greeting added
}

Output

SDL

interface IPerson implements IThing {
  greeting: String
}

interface IThing {
  greeting: String
}

type Admin implements IPerson & IThing {
  greeting: String
}

type User implements IPerson & IThing {
  greeting: String
}

TypeScript

import { GraphQLSchema, GraphQLInterfaceType, GraphQLString, GraphQLObjectType } from "graphql";
import { greeting as adminGreetingResolver, greeting as userGreetingResolver } from "./addStringFieldToInterfaceImplementedByInterface.js";
export function getSchema(): GraphQLSchema {
    const IThingType: GraphQLInterfaceType = new GraphQLInterfaceType({
        name: "IThing",
        fields() {
            return {
                greeting: {
                    name: "greeting",
                    type: GraphQLString
                }
            };
        }
    });
    const IPersonType: GraphQLInterfaceType = new GraphQLInterfaceType({
        name: "IPerson",
        fields() {
            return {
                greeting: {
                    name: "greeting",
                    type: GraphQLString
                }
            };
        },
        interfaces() {
            return [IThingType];
        }
    });
    const AdminType: GraphQLObjectType = new GraphQLObjectType({
        name: "Admin",
        fields() {
            return {
                greeting: {
                    name: "greeting",
                    type: GraphQLString,
                    resolve(source) {
                        return adminGreetingResolver(source);
                    }
                }
            };
        },
        interfaces() {
            return [IPersonType, IThingType];
        }
    });
    const UserType: GraphQLObjectType = new GraphQLObjectType({
        name: "User",
        fields() {
            return {
                greeting: {
                    name: "greeting",
                    type: GraphQLString,
                    resolve(source) {
                        return userGreetingResolver(source);
                    }
                }
            };
        },
        interfaces() {
            return [IPersonType, IThingType];
        }
    });
    return new GraphQLSchema({
        types: [IPersonType, IThingType, AdminType, UserType]
    });
}