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

如何在Nest.js & GraphQL中为嵌套对象定义类型文件?

问题描述

给定如下JSON数据示例:

{
  "id": "123",
  "categories": ["456"],
  "details": {
    "detail1": "123",
    "detail2": "456"
  }
}

我尝试为其编写GraphQL类型定义,代码如下:

data.type.ts文件:

@ObjectType("DataType")
export class DataType {
  @Field(type => ID)
  id: string
  @Field(() => [String])
  categories: string[]
  @Field(() => DetailsType)
  details: DetailsType
}

details.type.ts文件:

@ObjectType("DetailsType")
export class DetailsType {
  @Field(() => String)
  detail1: string
  @Field(() => String)
  detail2: string
}

但运行时出现错误:

无法为'details'确定GraphQL输出类型,请确保你的类已使用合适的装饰器进行装饰。

解决方案

这个错误的核心是GraphQL无法识别DetailsType的类型,常见修复方式如下:

  • 检查导入是否正确
    确认data.type.ts顶部已经导入了DetailsType:

    import { DetailsType } from './details.type';
    

    没导入的话,TypeScript可能不会报错,但GraphQL拿不到类的装饰器信息,自然无法解析类型。

  • 解决循环引用
    如果DataType和DetailsType互相导入,会导致装饰器初始化失败。可以:

    • 把两个类合并到同一个文件;
    • 用动态导入的方式在@Field里引用类型:
      @Field(() => import('./details.type').DetailsType)
      details: DetailsType;
      
  • 确认TypeScript装饰器配置
    检查tsconfig.json里是否开启了装饰器相关配置:

    {
      "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
      }
    }
    

    同时要确保@ObjectType和@Field都来自同一个GraphQL库(比如@nestjs/graphql或type-graphql),别混用不同库的装饰器。

  • 调整类定义顺序
    如果两个类在同一个文件里,要把DetailsType写在DataType前面,保证TypeScript能正确解析类型依赖。

内容的提问来源于stack exchange,提问作者saintyusuf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:33