The Types
From within the ./server sub-project, run the following command
shyarn codegen
You should see a new file appear with lots of types in it server/src/resolvers-types.generated.ts.
Sometimes after running this command, you may find you need to restart your TypeScript language server. In vscode you can do this
by opening any .ts file, and then running the > Restart TS Server command.
Go to server/src/resolvers.ts and import this new file, along with our “database utility”
tsimport Db from "./db"import { Resolvers } from "./resolvers-types.generated"
Add a return type annotation for createResolvers
diff- export function createResolvers() {+ export function createResolvers(): Resolvers {
Next, go to the file with your query resolvers server/src/resolvers/Query.ts, and add this import
tsimport { QueryResolvers } from "../resolvers-types.generated"
And a type annotation for the variable
tsconst queryTwitterResolvers: QueryResolvers = {
Run your test query again, it should work.
Add some sample data to return from suggestions() instead of the empty array
tsreturn [{name: "TypeScript Project",handle: "TypeScript",avatarUrl: "http://localhost:3000/static/ts-logo.png",reason: "Because you follow @MichaelLNorth",id: "1",},{name: "jQuery",handle: "jquery",avatarUrl:"http://localhost:3000/static/jquery-logo.jpeg",reason: "Because you follow @FrontendMasters",id: "2",},]
Everything should still type-check, but if you comment out some fields in these objects you should get some feedback from the TS compiler.
Context
There’s one more thing that’s convenient to do right now, and that’s provide a type for the context object that’s created for every new request
Add this interface to server/src/resolvers.ts
tsimport Db from "./db"export interface TwitterResolverContext {db: Db}
And pass it in as a typeparam to the resolver types
server/src/resolvers.ts
diff-const resolvers: Resolvers = {+const resolvers: Resolvers<TwitterResolverContext> = {
server/src/resolvers/Query.ts
diff+import { TwitterResolverContext } from '../resolvers';import { QueryResolvers } from '../resolvers-types.generated';-const queryTwitterResolvers: QueryResolvers+const queryTwitterResolvers: QueryResolvers<TwitterResolverContext>
One more place we can put this type is in server/src/apollo-server.ts
Just add the import
tsimport {createResolvers,TwitterResolverContext,} from "./resolvers"
And before creating the ApolloServer, create a new variable
tsconst context: () => TwitterResolverContext = () => ({ db })
and pass it in when you create your ApolloServer
diffconst server = new ApolloServer({- context: () => ({ db }),+ context,schema: addResolversToSchema({
Next, let’s get our React UI actually consuming some of this data, using a GraphQL client!