如何将graphql-scalars包与typegraphql框架集成?
将graphql-scalars与TypeGraphQL集成的方法
TypeGraphQL基于装饰器和类定义Schema,和graphql-scalars的原生集成方式略有差异,以下分场景说明适配方法:
一、集成单个特定标量
如果仅需使用某几个标量,按以下步骤操作:
- 导入目标标量的定义与解析器
// 以DateTime标量为例 import { DateTimeResolver, DateTimeTypeDefinition } from "graphql-scalars";
- 在构建Schema时注册标量
将标量解析器加入TypeGraphQL的解析器列表,同时导入标量的SDL定义:
import { buildSchema } from "type-graphql"; import { YourBusinessResolver } from "./resolvers/YourBusinessResolver"; async function createSchema() { const schema = await buildSchema({ // 业务解析器 + 标量解析器 resolvers: [YourBusinessResolver, DateTimeResolver], // 注入标量的SDL定义 typeDefs: [DateTimeTypeDefinition], }); return schema; }
- 在实体/Resolver中使用标量
在TypeGraphQL的对象类型或字段装饰器中指定标量名称:
import { ObjectType, Field, Query, Resolver } from "type-graphql"; @ObjectType() class Article { @Field(() => String) id: string; // 直接指定标量名称"DateTime" @Field(() => "DateTime") publishTime: Date; } @Resolver() class ArticleResolver { @Query(() => Article) getLatestArticle() { return { id: "1", publishTime: new Date(), }; } }
二、一次性集成所有graphql-scalars标量
如果需要使用大部分或全部标量,可以批量导入并注册:
- 批量导入所有标量的定义与解析器
import { resolvers as scalarResolvers, typeDefs as scalarTypeDefs } from "graphql-scalars";
- 批量注册到TypeGraphQL Schema
import { buildSchema } from "type-graphql"; import { YourBusinessResolver } from "./resolvers/YourBusinessResolver"; async function createSchema() { const schema = await buildSchema({ // 展开所有标量解析器,和业务解析器一起传入 resolvers: [YourBusinessResolver, ...Object.values(scalarResolvers)], // 注入所有标量的SDL定义 typeDefs: scalarTypeDefs, }); return schema; }
- 使用任意标量
之后就可以在任意对象类型或字段中直接使用对应标量名称,比如"EmailAddress"、"JSONObject"等。
三、更贴合TypeGraphQL风格的自定义标量类
你也可以将graphql-scalars的解析器包装成TypeGraphQL风格的标量类,无需手动管理SDL:
import { Scalar } from "type-graphql"; import { DateTimeResolver } from "graphql-scalars"; // 用@Scalar装饰器包裹原生解析器 @Scalar("DateTime", { description: DateTimeResolver.description, }) export class DateTimeScalar extends DateTimeResolver {}
然后直接在代码中引用这个类,构建Schema时无需额外传入typeDefs:
// 在对象类型中使用 @Field(() => DateTimeScalar) publishTime: Date; // 构建Schema时只需传入这个标量类 resolvers: [YourBusinessResolver, DateTimeScalar],
内容的提问来源于stack exchange,提问作者sev
相关产品推荐
相关产品推荐

