GraphQL Yoga 项目中使用 GraphQL Code Generator 实现类型安全
2025-07-07 02:13:55作者:虞亚竹Luna
GraphQL Code Generator 是一个强大的工具,能够根据 GraphQL 模式自动生成 TypeScript 类型定义和解析器文件。本文将详细介绍如何在 GraphQL Yoga 项目中配置和使用 GraphQL Code Generator,以实现类型安全和减少运行时错误。
为什么需要 GraphQL Code Generator
在 GraphQL 开发中,手动维护类型定义和解析器之间的对应关系既繁琐又容易出错。GraphQL Code Generator 可以:
- 自动生成 TypeScript 类型定义
- 确保解析器与模式定义严格匹配
- 提供更好的开发体验和代码提示
- 减少运行时类型错误
安装必要依赖
首先需要安装两个核心包:
npm install -D --save-exact @graphql-codegen/cli@5.0.3 @eddeee888/gcg-typescript-resolver-files@0.11.0
@graphql-codegen/cli
是 GraphQL Code Generator 的核心命令行工具@eddeee888/gcg-typescript-resolver-files
是专为 GraphQL 服务器设计的预设
项目结构调整
为了保持项目可维护性,建议将模式定义和解析器分离到不同文件中。创建以下目录结构:
src/
schema/
base/
schema.graphql
schema.mappers.ts
将 GraphQL 模式定义移动到 schema.graphql
文件中,包含所有类型定义。
配置 Code Generator
在项目根目录创建 codegen.ts
配置文件:
import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files'
import type { CodegenConfig } from '@graphql-codegen/cli'
const config: CodegenConfig = {
schema: 'src/schema/**/schema.graphql',
generates: {
'src/schema': defineConfig({
resolverGeneration: 'minimal',
typesPluginsConfig: {
contextType: '../context#GraphQLContext'
}
})
}
}
export default config
配置说明:
schema
指定模式定义文件位置generates
定义生成文件的输出目录resolverGeneration: 'minimal'
只生成根级解析器contextType
指定上下文类型位置
生成代码
运行以下命令生成代码:
npx graphql-codegen
生成的文件包括:
- 根级解析器文件(Query/Mutation)
- 解析器映射文件
- 合并后的模式定义
- 类型定义文件
- 生成的类型文件
迁移现有逻辑
根级解析器迁移
将现有解析器逻辑迁移到生成的解析器文件中。例如 feed
解析器:
export const feed: NonNullable<QueryResolvers['feed']> = async (_parent, args, context) => {
const where = args.filterNeedle
? {
OR: [
{ description: { contains: args.filterNeedle } },
{ url: { contains: args.filterNeedle } }
]
}
: {}
const take = applyTakeConstraints({
min: 1,
max: 50,
value: args.take ?? 30
})
return context.prisma.link.findMany({
where,
skip: args.skip,
take
})
}
使用映射器
映射器(Mappers)允许你指定 GraphQL 类型与底层数据模型之间的对应关系。例如,为 Link
类型创建映射器:
import type { Link } from '@prisma/client'
export type LinkMapper = Link
创建映射器后,Code Generator 会自动:
- 为所有 Link 解析器生成正确的父类型
- 创建 Link 解析器文件
- 执行静态分析确保类型安全
自定义对象类型解析器
要自定义对象类型解析器,只需创建空文件然后运行 Code Generator。例如创建 Comment
解析器:
import type { CommentResolvers } from './../../types.generated'
export const Comment: CommentResolvers = {
/* 实现 Comment 解析器逻辑 */
}
使用生成的解析器和类型定义
最后,在服务器配置中使用生成的解析器和类型定义:
import { createSchema } from 'graphql-yoga'
import { resolvers } from './schema/resolvers.generated'
import { typeDefs } from './schema/typeDefs.generated'
export const schema = createSchema({
resolvers: [resolvers],
typeDefs: [typeDefs]
})
维护生成的文件
建议:
- 不要手动修改
.generated.
文件 - 将这些文件添加到
.gitignore
- 在开发工具中忽略这些文件
总结
通过 GraphQL Code Generator 和 Server Preset,你可以:
- 自动获得类型安全的解析器
- 减少手动类型定义工作
- 提高代码质量和开发效率
- 更容易扩展和维护大型 GraphQL 服务器
这种设置特别适合中大型项目,能够显著提升开发体验和代码质量。