GraphQL字段解析器中Root参数的预期类型是什么?
TypeGraphQL字段解析器中@Root参数的类型选择
在TypeGraphQL里,字段解析器的@Root()参数应该用数据库返回的实际数据类型(也就是你的Event模型定义),原因很直接:
- 你的
events()查询返回的是EventModel.find().lean()的结果,这本质是数据库文档/对象(对应Event类型),而非EventType这个GraphQL schema层面的类型。EventType只是用来定义GraphQL接口的,实际运行时传给字段解析器的root值就是数据库返回的原始数据。 - 用数据库模型类型能拿到精准的TypeScript类型提示,避免类型不匹配问题——比如
root.date是数据库模型里的字段,用Event类型能确保TypeScript识别这个字段,而EventType可能和数据库模型存在字段差异(比如GraphQL类型可能省略某些数据库字段,或者多了计算字段)。
调整后的代码示例:
@Resolver(() => EventType) export class EventResolver { @Query(() => EventType) async events(): Promise<EventType[]> { const events = await EventModel.find().lean(); return events; } @FieldResolver(() => Boolean) async isActive(@Root() root: Event): Promise<boolean> { // root是数据库返回的Event文档类型,可正常访问date字段 return datechecker(root.date); } }
需要注意,只要EventType和Event模型的字段在运行时兼容(比如EventType的字段是Event模型字段的子集),TypeScript不会报错,但用数据库模型类型更贴合实际运行逻辑,也更利于后续代码维护。
内容的提问来源于stack exchange,提问作者radop33392
相关产品推荐
相关产品推荐

