如何在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
相关产品推荐
相关产品推荐

