【发布时间】:2020-08-31 11:54:15
【问题描述】:
考虑以下
栈是 type-graphql / type-orm / postgres
我使用Single Table Inheritance (STI) 和联合类型来表示多种提要类型。
一切正常——直到我想添加Field Resolver——但我找不到让它工作的方法。
您似乎无法将接口类型传递给@Resolver
一些代码片段来说明:
抽象的顶级实体
@InterfaceType()
@Entity({ orderBy: { createdAt: 'DESC' } })
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class FeedItem {
@Field(() => ID)
@PrimaryGeneratedColumn('uuid')
id: string
@Field()
@Column({ nullable: false })
type: string
@Field(() => Customer, { nullable: true })
@ManyToOne(
() => Customer,
customer => customer.feedItems,
{ onDelete: 'CASCADE' }
)
customer: Lazy<Customer>
@Field(() => [FeedItemComment])
@OneToMany(
() => FeedItemComment,
feedItemComment => feedItemComment.feedItem,
{ lazy: true }
)
comments: Lazy<FeedItemComment[]>
解析器
export const FeedResultUnion = createUnionType({
name: 'FeedItemResult', // the name of the GraphQL union
types: [AuthoredFeedItem, MilestoneFeedItem, TaskFeedItem, AssessmentFeedItem, WeeklySummaryFeedItem], // array of object types classes
@Resolver(() => FeedItem) // <---- this does not work, nor does FeedItemResult
export class FeedItemResolver {
// would love to do something like the following, but can't ...
@Authorized()
@FieldResolver(() => CommentsResponse)
async comments(@Root() feedItem: FeedItem) {
const [feedItems, count] = await getRepository(FeedItemComment).findAndCount({
where: {
feedItem,
},
order: { createdOn: 'DESC' },
})
return {
items: feedItems,
count,
}
}
}
})
谁能给我指出一条通往胜利的道路?!
【问题讨论】:
-
从 v0.18.0-beta.14 版本开始应支持接口解析器。见here。工会的解析器不会是因为工会不定义字段。从技术上讲,GraphQL 中不存在接口字段的解析器,但是像
type-graphql和graphql-tools这样的库将解析器复制到每个实现类型的解析器中。你用的是什么版本? -
另外,描述什么是“不工作”也会很有帮助。你看到了什么错误,如果有的话?预期的行为是什么,您实际看到的行为是什么?
标签: typescript graphql typeorm typegraphql