TypeGraphQL添加Post的creator字段报NoExplicitTypeError问题求助
问题原因
你遇到的类型报错是因为较新版本的TypeGraphQL不再支持自动推断自定义@ObjectType装饰类的字段类型,必须显式指定返回类型。你之前写的@Field(() => [User])中[]代表返回User类型数组,和你单个creator对象的定义不符,所以会出现返回空数据的问题。
修复步骤
1. 修正Post实体的creator字段定义
// 显式指定返回单个User对象,不要加[] @Field(() => User) @ManyToOne(() => User, (user) => user.posts) creator: User;
这一步即可解决NoExplicitTypeError类型报错。
2. 解决creator字段返回空的问题
TypeORM默认不会自动加载关联属性,有两种常用修复方案:
方案A:查询时主动加载关联属性
- 单个Post查询修改为:
@Query(() => Post, { nullable: true }) post(@Arg("id") id: number): Promise<Post | undefined> { return Post.findOne(id, { relations: ["creator"] }); }
- 分页查询的QueryBuilder添加关联加载:
const qb = getConnection() .getRepository(Post) .createQueryBuilder("p") .leftJoinAndSelect("p.creator", "creator") // 新增这行加载creator关联 .orderBy('"createdAt"', "DESC") .take(reaLimitPlusOne);
方案B:添加FieldResolver懒加载creator(更推荐)
在PostResolver中新增creator字段的解析逻辑,不需要修改原有查询代码:
// 先导入User实体 import { User } from "../entities/User"; // 在PostResolver类中添加如下方法 @FieldResolver(() => User) async creator(@Root() post: Post) { return User.findOne(post.creatorId); }
补充说明
Ben教程中的写法可正常运行是因为他使用的是较早版本的TypeGraphQL,当时还支持对自定义ObjectType类的自动类型推断,后续版本调整规则后必须显式指定类型。
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

