You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将graphql-scalars包与typegraphql框架集成?

将graphql-scalars与TypeGraphQL集成的方法

TypeGraphQL基于装饰器和类定义Schema,和graphql-scalars的原生集成方式略有差异,以下分场景说明适配方法:

一、集成单个特定标量

如果仅需使用某几个标量,按以下步骤操作:

  1. 导入目标标量的定义与解析器
// 以DateTime标量为例
import { DateTimeResolver, DateTimeTypeDefinition } from "graphql-scalars";
  1. 在构建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;
}
  1. 在实体/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标量

如果需要使用大部分或全部标量,可以批量导入并注册:

  1. 批量导入所有标量的定义与解析器
import { resolvers as scalarResolvers, typeDefs as scalarTypeDefs } from "graphql-scalars";
  1. 批量注册到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;
}
  1. 使用任意标量
    之后就可以在任意对象类型或字段中直接使用对应标量名称,比如"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:20:30